Même quand /tmp
n'a pas de fichier appelé something
, la recherche avec find
renverra 0:
$ find /tmp -name something
$ echo $?
0
Comment obtenir un état de sortie différent de zéro lorsque find
ne trouve rien?
Voici un one-liner qui, je crois, fait ce que vous voulez:
find /tmp -name something | egrep '.*'
Le statut de retour sera 0
quand quelque chose est trouvé, et différent de zéro sinon.
Si vous devez également capturer la sortie de find
pour un traitement ultérieur, la réponse de Sven a couvert cela.
Solution la plus simple qui n'imprime pas, mais quitte 0 lorsque les résultats sont trouvés
find /tmp -name something | grep -q "."
La sortie 0 est facile avec find, la sortie> 0 est plus difficile car cela ne se produit généralement qu'avec une erreur. Cependant, nous pouvons y arriver:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
Après avoir trouvé cette question tout en essayant de trouver mon moyen de résoudre un problème avec Puppet (modifier les autorisations sur les dossiers sous un répertoire mais pas sur le répertoire lui-même), cela semble fonctionner:
test -n "$(find /tmp -name something)"
Mon cas d'utilisation spécifique est le suivant:
test -n "$(find /home -mindepth 1 -maxdepth 1 -perm -711)"
Qui quittera le code 1 si la commande find ne trouve aucun fichier avec les autorisations requises.
Ce n'est pas possible. Find renvoie 0 s'il se termine avec succès, même s'il n'a pas trouvé de fichier (ce qui est un résultat correct pas indiquant une erreur alors que le fichier n'existe pas).
Pour citer la page de manuel find
ÉTAT DE SORTIE
rechercher les sorties avec l'état 0 si tous les fichiers sont traités avec succès, supérieures à 0 si des erreurs se produisent. Il s'agit délibérément d'une description très large, mais si la valeur de retour est non nulle, vous ne devez pas vous fier à l'exactitude des résultats de la recherche.
Selon ce que vous voulez réaliser, vous pouvez essayer de laisser trouver -print
le nom du fichier et testez sa sortie:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
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`
Voici un petit script que j'ai appelé test.py
. Il améliore les autres méthodes publiées en ce sens qu'il renverra un code d'erreur s'il en est défini un, et il en a également défini un si find n'a répertorié aucun fichier:
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 en 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 a eu des erreurs mais a trouvé 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 utiliser -print 0
passé à find
et fractionné la variable out sur null, ou vous pouvez simplement ajouter une instruction print pour cela.