Ich frage mich, ob es eine Möglichkeit gibt, Dateien basierend auf der Ausgabe oder dem Exit-Code eines anderen Programms in die Ergebnisse von find(1) einzuschließen oder auszuschließen. Insbesondere möchte ich find(1) so ausführen können, dass es nur die Dateien zurückgibt, die eine positive Übereinstimmung mit einem regulären Ausdruck enthalten.
Mir ist bewusst, dass dies dadurch erreicht werden kann, dass die Ausgabe von find(1) durch egrep weitergeleitet wird, aber ich möchte dies alles gerne innerhalb von find(1) tun können.
Gibt es beispielsweise eine Möglichkeit, Folgendes in einen einzelnen Aufruf von find(1) ohne Pipes umzuwandeln?
find . [test] | xargs egrep -l [regex]
Antwort1
-exec
wird als „true“ ausgewertet, wenn der Befehl null (Erfolg) zurückgibt:
find . -type f -exec egrep -qs "regex" {} \; -print
Ersetzen Sie es -print
durch eine Aktion Ihrer Wahl.
Beachten Sie jedoch, dass dieser Weg egrep
einmal ausgeführt wird fürjede Datei. Vergleichen:
gleich ~/code $ Zeit finden -Typ f -exec grep -qs bin/env {} \; -print | wc -l 60 real 0m0.760s Benutzer 0m0.104s System 0 m 0,596 s
Vergleiche
gleich ~/code $ Zeit finde -Typ f -print0 | xargs -0 egrep -l bin/env | wc -l 60 real 0m0.021s Benutzer 0m0.003s System 0 m 0,023 s
(Getestet auf einem eher kleinen Git-Repository, 300 Dateien, ~2,6 MB.)