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?


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.