make find schlägt fehl, wenn nichts gefunden wurde

8

Wenn findes aufgerufen wird, um nichts zu finden, wird es immer noch mit Code 0 beendet. Gibt es eine Möglichkeit, einen Exit-Code zurückzugeben, der auf einen Fehler hinweist, wenn keine Datei gefunden wurde?

XZS
quelle
1
Ich denke nicht, dass es finddirekt unterstützt wird. Sie können so etwas find ... -print0 | grep -qz .vielleicht tun , wenn Sie es grepunterstützen.
Muru
Mein grep ist gnu grep, also unterstützt es diese nette Idee. Leider muss die Find-Ausgabe auch irgendwo weitergeleitet werden und ich kann die Leitung nicht durch ersetzen -exec.
XZS
Ich mache etwas.
PNDA
1
@XZS können Sie überspringen -q, dann grepwerden die Daten einfach durchlaufen, während die Pipeline weiterhin unterbrochen wird und ein Fehler gemeldet wird, wenn nichts durchkommt .
Muru
@muru Ein Nichtstun-Grep, der die Pfeife bewacht, sehr elegant. Verwandeln Sie dies in eine Antwort und es wird akzeptiert.
XZS

Antworten:

7

Wenn Sie grepdas Lesen von NUL-getrennten Zeilen unterstützen (wie GNU grepmit -z), können Sie damit testen, ob etwas ausgegeben wurde von find:

find /some/path -print0 | grep -qz .

Um die Daten an einen anderen Befehl weiterzuleiten , können Sie die -qOption entfernen und die grepDaten unverändert weitergeben lassen, während immer noch ein Fehler gemeldet wird, wenn nichts durchgekommen ist:

find /some/path -print0 | grep -z . | ...

Insbesondere sollte ${PIPESTATUS[1]}in bash der Exit-Status von gehalten werden grep.

Wenn Sie finddies nicht unterstützen -print0, verwenden Sie grep ohne -zund hoffen, dass Zeilenumbrüche in Dateinamen keine Probleme verursachen:

find ... | grep '^' | ...

In diesem Fall ist die Verwendung von ^anstelle von .möglicherweise sicherer. Wenn die Ausgabe aufeinanderfolgende Zeilenumbrüche enthält, ^werden diese weitergeleitet, jedoch .nicht.

muru
quelle
Grep's -zist eine GNU-Erweiterung. Hast du etwas für mehr Posixy?
@jww unwahrscheinlich, da Sie mit reinem POSIX keinen Fehler in der Mitte eines Shell-Pipe erkennen können. Wenn Sie eine Shell haben, die das kann (via PIPE_STATUSoder ähnliches), dann hat sie wahrscheinlich eine, readdie nullbegrenzte Eingaben machen kann; dann können Sie eine einzelne Zeile lesen, fehlschlagen, wenn leer; oder drucken Sie es wieder aus und catden Rest. (Angenommen, Sie möchten die Daten an etwas anderes weitergeben, sonst können Sie dies wahrscheinlich tun find ... -exec echo foo {} \+ | grep -q foo.)
Muru
2

Sie fragen speziell nach einem Rückkehrcode ... den ich in den Optionen nicht sehe. Aber so habe ich es gelöst (weil grep -zes nicht am Mac-Port ist):

Gibt Code 0 aus, wenn 1 Zeile gefunden wurde

test 1 == `find */.kitchen/ -name private_key | wc -l`

Damit...

if [ 0 == `find */.kitchen/ -name my-file.txt | wc -l` ] ; then
   echo "Nothing found"; exit;
fi

Als generische Lösung kann dies auch nützlich sein:

Überprüfen Sie, ob die Pipe leer ist, und führen Sie einen Befehl für die Daten aus, falls dies nicht der Fall ist

Ondra Žižka
quelle