Antworten:
Hier ist ein Einzeiler, von dem ich glaube, dass er macht, was Sie wollen:
find /tmp -name something | egrep '.*'
Der Rückgabestatus ist, 0
wenn etwas gefunden wurde, andernfalls nicht Null.
Wenn Sie auch die Ausgabe von find
fü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
find
scheint nicht von den Exit-Codes der von ihm ausgeführten -exec
s abzuhängen .
exec
Abschnitt 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, -print
den 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 0
weitergegeben find
und spalten das aus Variable auf NULL - Werten, oder Sie können nur eine print - Anweisung für hinzufügen.
Es ist nicht nur so, find
dass 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 demegrep
Regex ist vollständig überflüssig. Da Sie keineegrep
Syntax für reguläre Ausdrücke verwenden, ist plain oldgrep
möglicherweise einige Mikrosekunden schneller.