[Linux-bruxelles] locate ne trouve pas

Frederic Peters fpeters at entrouvert.com
Dim 14 Aou 14:49:11 CEST 2005


Eric Freyens écrivait :

> > compaq-petro:/home/didier/Documents# locate signature*txt
> > compaq-petro:/home/didier/Documents#
> C'est normal puisse que dès que tu passes un caractère générique (*?)
> dans un shell celui-ci commence par remplacer le signature*txt par le
> résultat comme tu n'as pas de signature*txt dans le répertoire le reste
> ne fonctionne pas car locate ne reçoit rien comme nom.

Il y a de l'idée, mais c'est faux :)

Imaginons le programme locate, le tout début, juste le moment où il
regarde ce qu'il doit chercher sur la ligne de commande.  Tant qu'à
imaginer, imaginons cela en Python, parce que ça ira plus vite...

  #! /usr/bin/env python
  import sys

  for arg in sys.argv[1:]:
      print "I'll look for", arg

Rapidement, sys.argv, c'est la liste des arguments, et [1:] c'est pour
les considérer tous sauf le premier, parce que le premier, c'est
toujours le nom du programme appelé (dans ce cas, ce serait locate.py).

Armé de ce programme de test, débutons.

 $ locate.py

Aucun paramètre, il n'affiche rien, logique.

 $ locate.py toto
I'll look for toto

Un paramètre, il va le chercher.

 $ locate.py toto tata
I'll look for toto
I'll look for tata

Deux paramètres.  Il va les chercher.

Ad vitam.

Faisons maintenant intervenir quelques caractères spéciaux.

 $ locate.py toto*tata
I'll look for toto*tata

Ah, pourtant il n'y a pas de fichier 'toto*tata' dans le répertoire,
le répertoire est même vide, c'est dire.

Mais si le répertoire n'était pas vide, s'il contenait un fichier
correspondant à toto*tata ?

 $ touch toto-titi-tata
 $ locate.py toto*tata
I'll look for toto-titi-tata

Ah.  Et un deuxième ?

 $ touch toto-tutu-tata
 $ locate.py toto*tata
I'll look for toto-titi-tata
I'll look for toto-tutu-tata

Voilà.  Nous constatons donc que quand le shell peut faire l'expansion
des paramètres, il le fait.  Et que quand il ne peut pas, il ne le
fait pas.

Mais comment s'assurer, dans un cas où il ferait l'expansion, qu'il ne
la fasse pas, parce qu'on n'en veut pas ?  On utilise des apostrophes.

 $ locate.py 'toto*tata'
I'll look for toto*tata

Ou des guillemets.

 $ locate.py "toto*tata"
I'll look for toto*tata


Cela est-il clair ?  Revenons maintenant au cas exposé par Didier.

  compaq-petro:/home/didier/Documents# locate signature*txt
  compaq-petro:/home/didier/Documents#

Que dalle.  Que s'est-il passé ?

locate a reçu 'signature*txt' en paramètre et a fait son boulot
là-dessus, c'est-à-dire chercher un fichier contenant ces caractères.
Qu'il ne trouve pas parce que, subtilité, locate ne travaille pas sur
des noms de fichier mais sur des chemins complets, c'est-à-dire:
  '/usr/bin/ethereal' et non 'ethereal'

Et quand locate voit des métacaractères (*?[]) dans ce qu'il doit
chercher, il cherche à les appliquer sur la totalité du chemin.  Une
recherche sur 'signature*txt' cherchera donc une entrée commençant par
'signature', puis avec des caractères, peu importe, et se terminant
par 'txt'.  Mais commencer par 'signature', il ne trouvera rien, il
faut lui dire que n'importe quoi peu précéder 'signature'.

Et là, Éric de son prémisce erroné, donne quand même une solution
correcte:

  locate '*/signature*txt'


Reprenons la suite du message original, dans le répertoire contenant
les fichiers, locate semblait fonctionner:

  compaq-petro:/home/didier/Documents/Textdocuments# locate signature*txt
  /home/didier/Documents/Textdocuments/signature_mails_perso.txt
  /home/didier/Documents/Textdocuments/signature_mails_perso.txt~
  /home/didier/Documents/Textdocuments/signature_mails_privé.txt
  /home/didier/Documents/Textdocuments/signature_mails_privé.txt~
  /home/didier/Documents/Textdocuments/signature_mails_pro.txt
  /home/didier/Documents/Textdocuments/signature_mails_pro.txt~

Pourquoi donc ?  Parce que le shell a pu faire l'expansion du
paramètre, et que locate a ainsi été appelé avec les paramètres
suivants:
  signature_mails_perso.txt
  signature_mails_privé.txt
  signature_mails_pro.txt

Ces paramètres ne contenant pas de métacaractères, locate s'est
contenté de chercher les entrées contenant les caractères, sans
plus, sans moins.


Voilà tout,

        Frédéric




Plus d'informations sur la liste de diffusion Linux-bruxelles