Ausschließen/Einschließen von Dateien aus dem Unix-Suchbefehl basierend auf dem Programm

Ausschließen/Einschließen von Dateien aus dem Unix-Suchbefehl basierend auf dem Programm

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

-execwird als „true“ ausgewertet, wenn der Befehl null (Erfolg) zurückgibt:

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

Ersetzen Sie es -printdurch eine Aktion Ihrer Wahl.


Beachten Sie jedoch, dass dieser Weg egrepeinmal 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.)

verwandte Informationen