Gibt es eine Möglichkeit, das find
zu erzwingen Befehl zum Stoppen direkt nach dem Finden der ersten Übereinstimmung?
Akzeptierte Antwort:
Mit GNU oder FreeBSD find
, können Sie das -quit
verwenden Prädikat:
find . ... -print -quit
Das NetBSD find
Äquivalent:
find . ... -print -exit
Wenn Sie nur den Namen drucken und davon ausgehen, dass die Dateinamen keine Zeilenumbruchzeichen enthalten, könnten Sie Folgendes tun:
find . ... -print | head -n 1
Das wird find
nicht stoppen nach dem ersten Match, aber möglicherweise, je nach Timing und Pufferung beim zweiten Match oder (viel) später. Grundsätzlich find
wird mit einem SIGPIPE beendet, wenn es versucht, etwas auszugeben, während head
ist bereits weg, weil es bereits die erste Zeile der Eingabe gelesen und angezeigt hat.
Beachten Sie, dass nicht alle Shells auf diesen find
warten Befehl nach head
ist zurückgekommen. Die Bourne-Shell und AT&T-Implementierungen von ksh
(wenn nicht interaktiv) und yash
(nur wenn diese Pipeline der letzte Befehl in einem Skript ist) nicht, sodass sie im Hintergrund ausgeführt wird. Wenn Sie dieses Verhalten lieber in einer beliebigen Shell sehen möchten, können Sie das Obige jederzeit ändern in:
(find . ... -print &) | head -n 1
Wenn Sie mehr tun, als nur die Pfade der gefundenen Dateien zu drucken, können Sie diesen Ansatz ausprobieren:
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(ersetze printf
was auch immer Sie mit dieser Datei tun würden).
Das hat den Nebeneffekt von find
Rückgabe eines Exit-Status, der die Tatsache widerspiegelt, dass es jedoch getötet wurde.
Tatsächlich wird das SIGPIPE-Signal anstelle von SIGTERM verwendet (kill -s PIPE
statt kill
) wird dazu führen, dass einige Shells über diesen Tod schweigen (aber würden immer noch einen Exit-Status ungleich Null zurückgeben).