Réponses:
Voici une ligne qui, je crois, fait ce que vous voulez:
find /tmp -name something | egrep '.*'
L'état 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, alors la réponse de Sven a couvert cela.
find ... | read
La 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, exit> 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
find
ne semble pas dépendre des codes de sortie des programmes -exec
qu’il a exécutés.
exec
section, pas sous la valeur de retour). Il ne peut pas différencier rien trouvé et se trouver en erreur (par exemple, quand il a été invoqué sur un point de départ inexistant).
Ayant trouvé cette question tout en essayant de trouver un moyen de résoudre un problème avec Puppet (modifier les autorisations sur les dossiers situés dans un répertoire mais pas sur le répertoire lui-même), cela semble fonctionner:
! test -z $(find /tmp -name something)
Mon cas d'utilisation spécifique est le suivant:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Ce 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 réussit, même s'il n'a pas trouvé de fichier (résultat correct n'indiquant pas d'erreur lorsque le fichier n'existe pas).
Pour citer la page de manuel de recherche
STATUS DE SORTIE
trouver les exits avec le statut 0 si tous les fichiers sont traités avec succès, supérieur à 0 si des erreurs se produisent. C'est délibérément une description très large, mais si la valeur de retour est différente de zéro, vous ne devez pas vous fier à l'exactitude des résultats de find.
Selon ce que vous souhaitez réaliser, vous pouvez essayer de trouver -print
le nom du fichier et de le tester par rapport à sa sortie:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(utilisé avec +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
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`
-print -quit
, ce qui pourrait répondre à votre préoccupation.
Voici un petit script que j'ai appelé test.py
. Il améliore les autres méthodes publiées en ce sens qu'il renvoie un code d'erreur s'il est défini, et en ajoute un si find ne répertorie 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 avait des erreurs mais des fichiers trouvés:
$ 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 de fichiers que vous pouvez utiliser, -print 0
transmettez find
et divisez la variable out sur les valeurs null, ou vous pouvez simplement ajouter une instruction print pour elle.
Ce n'est pas seulement find
que renvoie les codes d'état de sortie à zéro lorsqu'il réussit. Sous Unix quelle que soit la commande que vous exécutez, si elle réussit, elle renvoie l'état de sortie à zéro.
*
sur laegrep
regex est complètement redondante. Puisque vous n'utilisez pasegrep
la syntaxe d'expression régulière, celagrep
peut prendre quelques microsecondes plus rapidement.