Risposte:
Ecco un one-liner che credo faccia quello che vuoi:
find /tmp -name something | egrep '.*'
Lo stato di ritorno sarà 0
quando viene trovato qualcosa, e diverso da zero altrimenti.
Se è necessario acquisire anche l'output di find
per ulteriori elaborazioni, la risposta di Sven lo ha coperto.
find ... | read
Soluzione più semplice che non stampa, ma esce 0 quando vengono trovati i risultati
find /tmp -name something | grep -q "."
Exit 0 è facile con find, exit> 0 è più difficile perché ciò accade di solito solo con un errore. Tuttavia possiamo farlo accadere:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
non sembra dipendere dai codici di uscita di tutti -exec
i messaggi in esecuzione.
exec
sezione, non sotto il valore restituito). Non può distinguere tra nulla trovato e trovarsi ad errori (ad es. Quando è stato invocato su un punto di partenza inesistente).
Avendo appena trovato questa domanda mentre cercavo di trovare il mio modo di risolvere un problema con Puppet (cambia i permessi sulle cartelle in una directory ma non sulla directory stessa), questo sembra funzionare:
! test -z $(find /tmp -name something)
Il mio caso d'uso specifico è questo:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Che uscirà dal codice 1 se il comando find non trova file con le autorizzazioni richieste.
Non è possibile. Trova restituisce 0 se esce correttamente, anche se non ha trovato un file (che è un risultato corretto che non indica un errore quando il file effettivamente non esiste).
Per citare la manpage di ricerca
STATO DI USCITA
trova le uscite con stato 0 se tutti i file vengono elaborati correttamente, maggiore di 0 se si verificano errori. Questa è deliberatamente una descrizione molto ampia, ma se il valore restituito è diverso da zero, non si dovrebbe fare affidamento sulla correttezza dei risultati di find.
A seconda di ciò che si desidera ottenere, è possibile provare a trovare -print
il nome del file e verificarne l'output:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(usato con +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Sento che questo è il metodo più conciso e diretto:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
, il che potrebbe rispondere alla tua preoccupazione.
Ecco una piccola sceneggiatura che ho chiamato test.py
. Migliora altri metodi pubblicati in quanto restituirà un codice di errore se uno è impostato e inoltre imposta uno se find non ha elencato alcun file:
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)
Ecco l'output della riga di comando:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Quindi, per un risultato in cui find ha avuto errori ma ha trovato file:
$ 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
Quindi, se si desidera l'elenco di file, è possibile utilizzare -print 0
passato find
e dividere la variabile out su null, oppure è possibile semplicemente aggiungere un'istruzione di stampa per esso.
Non solo find
restituisce i codici di stato di uscita come zero quando ha esito positivo. In unix qualunque sia il comando che esegui, se riesce, restituisce lo stato di uscita come zero.
*
sulegrep
regex è completamente ridondante. Dal momento che non stai usandoegrep
la sintassi delle espressioni regolari, la vecchiagrep
potrebbe essere più veloce di alcuni microsecondi.