Ich verwende find
und erhalte eine Liste der Dateien, grep
durch die ich gehen möchte . Wie leite ich diese Liste weiter grep
?
Nun, der generische Fall, der mit jedem Befehl funktioniert, der in stdout schreibt, ist die Verwendung xargs
, mit der Sie eine beliebige Anzahl von Befehlszeilenargumenten an das Ende eines Befehls anhängen können:
$ find … | xargs grep 'search'
Oder um den Befehl in Ihre grep
Zeile mit Backticks oder einzubetten $()
, wird der Befehl ausgeführt und die Ausgabe ersetzt:
$ grep 'search' $(find …)
Beachten Sie, dass diese Befehle nicht funktionieren, wenn die Dateinamen Leerzeichen oder bestimmte andere „seltsame Zeichen“ enthalten ( \'"
für xargs, \[*?
für $(find …)
).
Im speziellen Fall find
der Fähigkeit, ein Programm für die angegebenen Argumente auszuführen, ist jedoch Folgendes integriert:
$ find … -exec grep 'search' {} \;
Alles zwischen -exec
und ;
ist der auszuführende Befehl. {}
wird durch den gefundenen Dateinamen ersetzt durch find
. Dadurch wird grep
für jede Datei eine separate Datei ausgeführt. da grep
viele Dateinamen nehmen und suchen sie alle, können Sie die Änderung ;
zu +
allen zu sagen , finden Dateinamen die Anpassung an passieren grep
auf einmal:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
. QED. Obwohl-exec +
es sehr effizient ist, gibt es es nicht in allen Versionen von find.-exec
anstelle der zu verwendenxargs
. Wenn Sie das-exec
in verwendenfind
, wird nur eine Shell erstellt, um nach dem Inhalt zu suchen . Wenn Sie die verwendenxargs
, werden zwei Schalen erstellt: eine für diefind
und die andere für diexargs
.$ find … -exec grep 'search' {} \+
Form viel schneller ist.Einige Versionen von
grep
(z. B. unter nicht eingebettetem Linux, BSD oder Mac OS X)-r
bieten die Möglichkeit einer rekursiven Suche. Verwenden Sie unter OpenBSD-R
(und es gibt keine--exclude
wie im folgenden Beispiel). Dies umfasst einfache Kombinationen vonfind
mitgrep
.Wenn Ihre Implementierung nicht über das
-R
Flag verfügt oder wenn Sie schickere Dateizuordnungskriterien wünschen, können Sie das-exec
primäre von verwendenfind
, um die Ausführung zu veranlassengrep
. Einige älterefind
Implementierungen unterstützen nicht-exec
…+
; Verwenden Sie auf diesen Systemen a;
anstelle von a+
(dies wirdgrep
einmal pro Datei aufgerufen , ist also langsamer, aber ansonsten ist das Ergebnis dasselbe). Beachten Sie den/dev/null
Trick, der bewirktgrep
, dass der Dateiname auch dann angezeigt wird, wenn er zufällig für eine einzelne Datei aufgerufen wird (GNU grep und FreeBSD / NetBSD / OSX grep haben die-H
Option, denselben Effekt zu erzielen).quelle
GNU grep
hat die-H
Option, den Dateinamen immer zu drucken.