web-dev-qa-db-fra.com

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

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?

56
yael

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.

49
Steven Monday

Solution la plus simple qui n'imprime pas, mais quitte 0 lorsque les résultats sont trouvés

find /tmp -name something | grep -q "."
17
Matt Kneiser

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
14
Steven Penny

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.

9
shearn89

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
5
Sven

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`
1
danorton

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.

0
Jeff Ferland