Pourquoi **find** ne trouve-t-il rien ?
Question
Je recherche des fichiers de scripts shell installés sur mon système, mais trouver ça ne marche pas :
$ find /usr -name *.sh
Mais je sais qu'il existe une tonne de scripts.Par exemple:
$ ls /usr/local/lib/*.sh
/usr/local/lib/tclConfig.sh
/usr/local/lib/tkConfig.sh
Pourquoi pas trouver travail?
La solution
Essayez de citer le caractère générique :
$ find /usr -name \*.sh
ou:
$ find /usr -name '*.sh'
Si vous avez un fichier qui correspond *.sh dans le répertoire de travail actuel, le caractère générique sera développé avant que find ne le voie.Si vous avez un fichier nommé tkConfig.sh dans votre répertoire de travail, le trouver la commande s'étendrait à :
$ find /usr -name tkConfig.sh
qui ne trouverait que les fichiers nommés tkConfig.sh.Si vous aviez plus d'un fichier correspondant *.sh, vous obtiendrez une erreur de syntaxe de trouver:
$ cd /usr/local/lib
$ find /usr -name *.sh
find: bad option tkConfig.sh
find: path-list predicate-list
Encore une fois, la raison est que le caractère générique s'étend aux deux fichiers :
$ find /usr -name tclConfig.sh tkConfig.sh
Citer le caractère générique empêche son extension prématurée.
Une autre possibilité est que /usr ou l'un de ses sous-répertoires soit un lien symbolique. trouver ne suit normalement pas les liens, vous pourriez donc avoir besoin du -suivre option:
$ find /usr -follow -name '*.sh'
Autres conseils
Sur certains systèmes (Solaris, par exemple), il n'y a pas d'action par défaut, vous devez donc ajouter la commande -print.
find /usr -name '*.foo' -print
Pour trouver des fichiers sur vos disques, utilisez plutôt « localiser » qui est instantané (examine un index construit quotidiennement) Votre exemple serait :
locate '/usr*.sh'