Wenn find
es 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?
find
exit-status
XZS
quelle
quelle
find
direkt unterstützt wird. Sie können so etwasfind ... -print0 | grep -qz .
vielleicht tun , wenn Sie esgrep
unterstützen.-exec
.-q
, danngrep
werden die Daten einfach durchlaufen, während die Pipeline weiterhin unterbrochen wird und ein Fehler gemeldet wird, wenn nichts durchkommt .Antworten:
Wenn Sie
grep
das Lesen von NUL-getrennten Zeilen unterstützen (wie GNUgrep
mit-z
), können Sie damit testen, ob etwas ausgegeben wurde vonfind
:Um die Daten an einen anderen Befehl weiterzuleiten , können Sie die
-q
Option entfernen und diegrep
Daten unverändert weitergeben lassen, während immer noch ein Fehler gemeldet wird, wenn nichts durchgekommen ist:Insbesondere sollte
${PIPESTATUS[1]}
in bash der Exit-Status von gehalten werdengrep
.Wenn Sie
find
dies nicht unterstützen-print0
, verwenden Sie grep ohne-z
und hoffen, dass Zeilenumbrüche in Dateinamen keine Probleme verursachen: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.quelle
-z
ist eine GNU-Erweiterung. Hast du etwas für mehr Posixy?PIPE_STATUS
oder ähnliches), dann hat sie wahrscheinlich eine,read
die nullbegrenzte Eingaben machen kann; dann können Sie eine einzelne Zeile lesen, fehlschlagen, wenn leer; oder drucken Sie es wieder aus undcat
den Rest. (Angenommen, Sie möchten die Daten an etwas anderes weitergeben, sonst können Sie dies wahrscheinlich tunfind ... -exec echo foo {} \+ | grep -q foo
.)Sie fragen speziell nach einem Rückkehrcode ... den ich in den Optionen nicht sehe. Aber so habe ich es gelöst (weil
grep -z
es nicht am Mac-Port ist):Gibt Code 0 aus, wenn 1 Zeile gefunden wurde
Damit...
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
quelle