134 votes

Puis-je faire en sorte que `find` renvoie non-0 quand aucun fichier correspondant n'est trouvé ?

Même lorsque /tmp n'a pas de fichier appelé something en le cherchant avec find retournera 0 :

  $ find /tmp -name something 
  $ echo $?
  0

Comment puis-je obtenir un statut de sortie non nul lorsque find ne trouve rien ?

2 votes

Si votre objectif est de passer la liste des noms de fichiers à une commande qui se comporte mal lorsqu'elle n'a pas d'arguments, une astuce pratique est d'ajouter simplement /dev/null comme argument supplémentaire. Il est garanti d'être vide, donc si votre but est d'exécuter wc c'est particulièrement utile. Ce n'est pas une réponse à tous les cas d'utilisation.

3voto

Jamie C. Points 41

Je pense que c'est la méthode la plus concise et la plus directe :

test `find /tmp/ -name something -print -quit 2>/dev/null`

2 votes

Dans ce cas, si find avait une erreur, il imprimerait le résultat dans /dev/null, renverrait une sortie non nulle, puis serait fixé à 0 par la commande test.

0 votes

Je ne crois pas que ce soit vrai. Veuillez décrire votre exemple. S'il y a une erreur et que find sort, alors la chaîne sera vide et test retournera un résultat différent de zéro.

0 votes

Je ne suis pas sûr de ce que votre exemple pourrait être, mais j'ai accidentellement omis -print -quit qui pourrait répondre à votre préoccupation.

0voto

Tom Points 720

Voici un petit script que j'ai appelé test.py . Elle améliore les autres méthodes affichées dans la mesure où elle renvoie un code d'erreur si un code est défini, et elle en définit un en plus si find n'a pas listé de fichiers :

from subprocess import Popen
import sys

p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
    sys.exit(p.returncode)
if not out:
    sys.exit(1)

Voici la sortie de la ligne de commande :

$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1

Ensuite, pour un résultat où find avait des erreurs mais trouvait des fichiers :

$ ls -lh
$ d---------  2 jeff users   6 Feb  6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py 
../test.py
$ echo $?
1

Ensuite, si vous voulez la liste des fichiers, vous pouvez faire usage de -print 0 transmis à find et diviser la variable de sortie sur les nuls, ou vous pouvez simplement ajouter une instruction d'impression pour cela.

-5voto

JesusLives ii Points 777

Ce n'est pas seulement find qui renvoie les codes d'état de sortie à zéro lorsqu'il réussit. Dans unix, quelle que soit la commande que vous exécutez, si elle réussit, elle renvoie le statut de sortie à zéro.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X