2008-08-20 8 views
17

Je suis à la recherche pour les fichiers scripts shell installés sur mon système, mais trouver ne fonctionne pas:Pourquoi ** ne trouve-t-il rien?

$ find /usr -name *.sh 

Mais je sais qu'il ya une tonne de scripts là-bas. Par exemple:

$ ls /usr/local/lib/*.sh 
/usr/local/lib/tclConfig.sh 
/usr/local/lib/tkConfig.sh 

Pourquoi ne pas trouver travail?

+2

Est-ce une question SuperUser ? – endolith

+0

Cela convient mieux sur [UnixSE] (http://unix.stackexchange.com/) –

Répondre

51

Essayez de citer le caractère générique:

$ find /usr -name \*.sh 

ou:

$ find /usr -name '*.sh' 

Si vous arrive d'avoir un fichier qui correspond * .sh dans le répertoire de travail courant, le caractère générique sera élargi avant de trouver le voit. Si vous arrive d'avoir un fichier nommé tkConfig.sh dans votre répertoire de travail, la trouver la commande se développerait à:

$ find /usr -name tkConfig.sh 

qui trouverait que les fichiers nommés tkConfig.sh. Si vous aviez plus d'un fichier qui correspond * .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 étend aux deux fichiers:

$ find /usr -name tclConfig.sh tkConfig.sh 

Le fait de citer le caractère générique empêche son expansion prématurée.

Une autre possibilité est que/usr ou l'un de ses sous-répertoires soit un lien symbolique. trouver ne pas normalement suivre les liens, vous pourriez avoir besoin du -follow Option:

$ find /usr -follow -name '*.sh' 
+0

Que faire si le fichier est un script shell mais n'a pas l'extension '.sh'? Peut-être quelque chose comme 'trouver/xyz | fichier xargs | grep shell'? –

+0

À quelle fréquence, par conséquent, les scripts shell ** n'ont pas ** d'extension .sh? –

+0

Existe-t-il un moyen général de savoir quand/où un caractère générique est développé? – isaacg

15

Sur certains systèmes (Solaris, par exemple), il n'y a pas d'action par défaut, de sorte que vous devez ajouter le - commande d'impression.

find /usr -name '*.foo' -print 
+1

J'ai été un peu par là dans le passé. Mais je dois préciser que sur une boîte Solaris moderne, -print est activé par défaut. En fait, je n'arrive pas à trouver une trouvaille qui ne fonctionne plus de cette façon. –

7

Pour trouver des fichiers sur vos disques, maigre à utiliser « locate » à la place qui est instantanée (regarde dans un index construit tous les jours) vous par exemple serait:

locate '/usr*.sh' 
+0

Une bonne suggestion. (J'ai dû lancer updatedb sur ma machine pour tester l'idée, car je ne l'ai pas dans ma crontab pour une raison quelconque.) Avoir une base de données à jour serait la principale raison pour ne pas utiliser locate.) –

+0

Et il y a quelques systèmes qui n'ont pas de localisation installés par défaut - j'ai trouvé que je devais installer le paquet 'mlocate' sur mon Raspberry Pi - sans oublier le' sudo updatedb' après pour construire les index ... – SlySven

Questions connexes