Hallo, On Fri, 10 Jan 2003, Jürgen Vollmer wrote:
Jürgen Vollmer wrote:
[...] und dann eben noch xargs und grep
find directory -name "*.c" | xargs grep gesuchter-string
Thomas Hertweck
Wieso brauche ich dazu xargs und die Pipe? Das kann find doch direkt:
find directory -name "*.c" -exec grep -H gesuchterstring {} \;
Der Grund ist: bei exec wird jedesmal ein neuer Prozess gestartet, bei xargs eben nur soviele wie nötig sind umd die maximale Länge der Kommandozeile nicht zu überschreiten.
ACK. (BTW: die Grenze ist hier z.B. 132KB ;)
Wenn man also sagen wir 20.000 Dateien dann geht das schon in die Zeit: $ time find /usr/include -name "*.h" -exec grep -q foo \{\} \; real 0m28.483s $time find /usr/include -name "*.h" | xargs grep -q foo real 0m0.201s
Im übrigen vergesse ich immer die \ bei { } und ; im exec :-)
Die bei {} sind nicht noetig. Die expandiert die shell nicht (ohne $ davor). find ... -exec bla {} \;
Das -H sollte man wohl auch bei Deinem Fefehl benutzen, oder? Sonst habe ich zwar einen Match, weiss aber nicht in welcher Da- tei... wie man will.
Das geht in beiden Varianten: $ find /usr/include/ -name '*.h' | xargs grep -cH 'foo' | grep -v ':0$' /usr/include/libxml/xlink.h:3 [..] $ find /usr/include/ -name '*.h' -exec grep -cH 'foo' {} \; | grep -v ':0$' /usr/include/libxml/xlink.h:3 [..] -dnh -- DAUs zu erklären, waß DAU ißt wäre ein Kochbuch, das keiner lesen kann. [Wolfgang Tittel in dag°]