Antworten:
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.
$ 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 von find
mit grep
.
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 verwenden find
, um die Ausführung zu veranlassen grep
. Einige ältere find
Implementierungen unterstützen nicht -exec
… +
; Verwenden Sie auf diesen Systemen a ;
anstelle von a +
(dies wird grep
einmal pro Datei aufgerufen , ist also langsamer, aber ansonsten ist das Ergebnis dasselbe). Beachten Sie den /dev/null
Trick, der bewirkt grep
, 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).
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
GNU grep
hat die -H
Option, den Dateinamen immer zu drucken.