Antworten:
Hier ist ein Einzeiler, von dem ich glaube, dass er macht, was Sie wollen:
find /tmp -name something | egrep '.*'
Der Rückgabestatus ist, 0wenn etwas gefunden wurde, andernfalls nicht Null.
Wenn Sie auch die Ausgabe von findfür die weitere Verarbeitung erfassen müssen , hat die Antwort von Sven dies abgedeckt.
find ... | read
Einfachste Lösung, die nicht druckt, aber 0 verlässt, wenn Ergebnisse gefunden werden
find /tmp -name something | grep -q "."
Exit 0 ist mit find einfach, Exit> 0 ist schwieriger, weil das normalerweise nur mit einem Fehler passiert. Wie auch immer, wir können es schaffen:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
findscheint nicht von den Exit-Codes der von ihm ausgeführten -execs abzuhängen .
execAbschnitt ausgeblendet , nicht unter Rückgabewert). Es kann nicht zwischen nichts, was gefunden wurde, und sich selbst als fehlerhaft herausstellen (z. B. wenn es an einem nicht existierenden Ausgangspunkt aufgerufen wurde).
Nachdem ich diese Frage gerade gefunden habe, als ich versucht habe, ein Problem mit Puppet zu lösen (Berechtigungen für Ordner in einem Verzeichnis ändern, aber nicht für das Verzeichnis selbst), scheint dies zu funktionieren:
! test -z $(find /tmp -name something)
Mein spezieller Anwendungsfall ist dieser:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Womit Code 1 beendet wird, wenn der Befehl find keine Dateien mit den erforderlichen Berechtigungen findet.
Es ist nicht möglich. Find gibt 0 zurück, wenn es erfolgreich beendet wurde, auch wenn es keine Datei gefunden hat (was ein korrektes Ergebnis ist und keinen Fehler anzeigt, wenn die Datei tatsächlich nicht existiert).
Zitiert die Suchmanpage
EXIT STATUS
find-Exits mit Status 0, wenn alle Dateien erfolgreich verarbeitet wurden, größer als 0, wenn Fehler auftreten. Dies ist absichtlich eine sehr breite Beschreibung. Wenn der Rückgabewert jedoch nicht Null ist, sollten Sie sich nicht auf die Richtigkeit der Ergebnisse von find verlassen.
Je nachdem, was Sie erreichen möchten, können Sie versuchen, -printden Dateinamen zu ermitteln und anhand der Ausgabe zu testen:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec/ dokumentiert execdir(verwendet mit +):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Ich halte dies für die prägnanteste und direkteste Methode:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit, was Ihr Anliegen ansprechen könnte.
Hier ist ein kleines Skript, das ich angerufen habe test.py. Es verbessert andere Methoden dahingehend, dass es einen Fehlercode zurückgibt, wenn einer festgelegt ist, und zusätzlich einen, wenn find keine Dateien auflistet:
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)
Hier ist die Befehlszeilenausgabe:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Für ein Ergebnis, bei dem find Fehler hatte, aber Dateien gefunden hat:
$ 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
Dann, wenn Sie die Liste der Dateien möchten , können Sie Gebrauch machen -print 0weitergegeben findund spalten das aus Variable auf NULL - Werten, oder Sie können nur eine print - Anweisung für hinzufügen.
Es ist nicht nur so, finddass die Exit-Statuscodes bei Erfolg als Null zurückgegeben werden. In Unix gibt der Befehl, den Sie ausführen, bei Erfolg den Exit-Status als Null zurück.
*auf demegrepRegex ist vollständig überflüssig. Da Sie keineegrepSyntax für reguläre Ausdrücke verwenden, ist plain oldgrepmöglicherweise einige Mikrosekunden schneller.