Dateien aus dem Unix-Suchbefehl basierend auf dem Programm ausschließen / einschließen

0

Ich frage mich, ob es eine Möglichkeit gibt, Dateien basierend auf dem Ausgabe- oder Beendigungscode eines anderen Programms in die Ergebnisse von find (1) ein- oder auszuschließen. Insbesondere möchte ich find (1) so ausführen können, dass nur die Dateien zurückgegeben werden, die einen positiven Ausdruck für einen regulären Ausdruck enthalten.

Mir ist klar, dass dies durch Pipe der Ausgabe von find (1) durch egrep erreicht werden kann, aber ich möchte alles in find (1) ausführen können.

Gibt es beispielsweise eine Möglichkeit, das Folgende in einen einzigen Aufruf von find (1) ohne Pipes zu konvertieren?

find . [test] | xargs egrep -l [regex]
Bryan Kyle
quelle

Antworten:

2

-exec wird als "true" ausgewertet, wenn der Befehl Null (Erfolg) zurückgibt:

find . -type f -exec egrep -qs "regex" {} \; -print

Ersetzen -print mit Aktion Ihrer Wahl.


Betrachten Sie dies jedoch auf diese Weise egrep wird einmal für ausgeführt jede Datei . Vergleichen Sie:

equal ~/code $ time find -type f -exec grep -qs bin/env {} \; -print | wc -l
60

real    0m0.760s
user    0m0.104s
sys     0m0.596s

vs

equal ~/code $ time find -type f -print0 | xargs -0 egrep -l bin/env | wc -l
60

real    0m0.021s
user    0m0.003s
sys     0m0.023s

(Getestet auf einem eher kleinen Git-Repository, 300 Dateien, ~ 2,6 MB.)

grawity
quelle