[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