Hallo, ich benötige die Syntax um diverse Dateien nach einem String durchsuchen zu lassen. Klar das geht z.B. mit fgrep o.ä. ... Ich bekomme das aber nur hin, wenn die Datei oder die Dateien angebe. Da aber ein ganzer Verzeichnisbaum durchsucht werden soll, habe ich hiermit ein Problem. Wie kann ich das also kombinieren? Wäre toll, wenn mir jemand die Kommandos mailen könnte. Gruss, Andreas
Tach, Andreas Schlegel schrieb:
ich benötige die Syntax um diverse Dateien nach einem String durchsuchen zu lassen. Klar das geht z.B. mit fgrep o.ä. ... Ich bekomme das aber nur hin, wenn die Datei oder die Dateien angebe. Da aber ein ganzer Verzeichnisbaum durchsucht werden soll, habe ich hiermit ein Problem. Wie kann ich das also kombinieren?
`grep -r $Suchbegriff $Verzeichnis` Gruß, Patrick
Andreas Schlegel
ich benötige die Syntax um diverse Dateien nach einem String durchsuchen zu lassen. Klar das geht z.B. mit fgrep o.ä. ... Ich bekomme das aber nur hin, wenn die Datei oder die Dateien angebe. Da aber ein ganzer Verzeichnisbaum durchsucht werden soll, habe ich hiermit ein Problem. Wie kann ich das also kombinieren? Wäre toll, wenn mir jemand die Kommandos mailen könnte.
find ist Dein Freund bein finden von Dateien, z.B. find directory -name "*.c" und dann eben noch xargs und grep find directory -name "*.c" | xargs grep gesuchter-string xargs ruft grep mit sovielen Datein auf, wie es das Betriebsystem auf einmal zulässt. (da die Kommandozeile halt eine maximale endliche Länge hat) Mehr dazu in man find etc. Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 juergen@informatik-vollmer.de,vollmer@cocolab.de,Juergen.Vollmer@acm.org www.informatik-vollmer.de
Jürgen Vollmer wrote:
[...] und dann eben noch xargs und grep
find directory -name "*.c" | xargs grep gesuchter-string
Wieso brauche ich dazu xargs und die Pipe? Das kann find doch direkt: find directory -name "*.c" -exec grep -H gesuchterstring {} \; Das -H sollte man wohl auch bei Deinem Fefehl benutzen, oder? Sonst habe ich zwar einen Match, weiss aber nicht in welcher Da- tei... CU, Th. -- Thomas Hertweck, Dipl.-Geophys., GPI Universitaet Karlsruhe === First they ignore you, then they laugh at you, then === === they fight you, then you win. (M. Ghandi) ===
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. 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 user 0m7.690s sys 0m10.600s $time find /usr/include -name "*.h" | xargs grep -q foo real 0m0.201s user 0m0.070s sys 0m0.080s Im übrigen vergesse ich immer die \ bei { } und ; im exec :-)
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.
Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 juergen@informatik-vollmer.de,vollmer@cocolab.de,Juergen.Vollmer@acm.org www.informatik-vollmer.de
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°]
* Andreas Schlegel schrieb am 10.Jan.2003:
ich benötige die Syntax um diverse Dateien nach einem String durchsuchen zu lassen. Klar das geht z.B. mit fgrep o.ä. ... Ich bekomme das aber nur hin, wenn die Datei oder die Dateien angebe. Da aber ein ganzer Verzeichnisbaum durchsucht werden soll, habe ich hiermit ein Problem. Wie kann ich das also kombinieren? Wäre toll, wenn mir jemand die Kommandos mailen könnte.
Entweder grep -r Suchbegriff Verzeichnis oder wenn Du die Dateien, wo gesucht wird einschränken möchtest: find Verzeichnis -type f .... -exec grep -l Suchbegriff {} \; Anstelle des ... die weiteren Einschränkungen. Siehe hierzu man find. -type f ist vor allem wichtig, wenn Du nicht nur normale Dateien, sondern auch etwa FIFOs hast, denn sonst wartest Du ewig. Wenn Du Dateinamen mit Leerzeichen hast, geht das schief, dann mußt Du es folgendermaßen machen: find Verzeichnis -type f .... -print0 | xargs -0 grep Suchbegriff Bernd -- ROTFL = Rolling On The Floor, Laughing = Auf dem Boden wälzen, lachend. SCNR = Sorry, Could Not Resist = Sorry, Ich konte nicht wiederstehen. AFAIK = As Far As I Know = So weit ich weis|BTW = By The Way = Nebenbei bemerkt IMHO = In My Humble Opinion = meiner bescheidenen Meinung nach |Zufallssig. 9
On Fre, 10 Jan 2003 at 20:08 (+0100), Bernd Brodesser wrote: [...]
Wenn Du Dateinamen mit Leerzeichen hast, geht das schief, dann mußt Du es folgendermaßen machen:
find Verzeichnis -type f .... -print0 | xargs -0 grep Suchbegriff
Ist nicht nötig: jan@k500:~/tmp> date >"Datei mit Loch" jan@k500:~/tmp> date >"Datei_ohne_Loch" jan@k500:~/tmp> find . -type f -exec grep -l Jan {} \; ./Datei_ohne_Loch ./Datei mit Loch jan@k500:~/tmp> Jan
* Jan Trippler schrieb am 10.Jan.2003:
On Fre, 10 Jan 2003 at 20:08 (+0100), Bernd Brodesser wrote: [...]
Wenn Du Dateinamen mit Leerzeichen hast, geht das schief, dann mußt Du es folgendermaßen machen:
find Verzeichnis -type f .... -print0 | xargs -0 grep Suchbegriff
Ist nicht nötig:
jan@k500:~/tmp> date >"Datei mit Loch" jan@k500:~/tmp> date >"Datei_ohne_Loch" jan@k500:~/tmp> find . -type f -exec grep -l Jan {} \; ./Datei_ohne_Loch ./Datei mit Loch jan@k500:~/tmp>
Stimmt, es ging dabei auch um einen Dateinamen, in dem ein RETURN ist. Ich gebe ja zu, daß so ein Dateinamen recht krank ist. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12
Hallo, On Sat, 11 Jan 2003, Bernd Brodesser wrote:
* Jan Trippler schrieb am 10.Jan.2003:
On Fre, 10 Jan 2003 at 20:08 (+0100), Bernd Brodesser wrote: [...]
Wenn Du Dateinamen mit Leerzeichen hast, geht das schief, dann mußt Du es folgendermaßen machen:
find Verzeichnis -type f .... -print0 | xargs -0 grep Suchbegriff
Ist nicht nötig:
jan@k500:~/tmp> date >"Datei mit Loch" jan@k500:~/tmp> date >"Datei_ohne_Loch" jan@k500:~/tmp> find . -type f -exec grep -l Jan {} \; ./Datei_ohne_Loch ./Datei mit Loch jan@k500:~/tmp>
Stimmt, es ging dabei auch um einen Dateinamen, in dem ein RETURN ist. Ich gebe ja zu, daß so ein Dateinamen recht krank ist.
Kein Problem! Haben wir: dh@slarty[3]:/tmp/test/kranke_dateinamen (0)$ ls -1 -b "foo"\nand\n"bar" a\nb a\r\ b a\ b foo;\ ls\ -rf ß\ ä dh@slarty[3]:/tmp/test/kranke_dateinamen (0)$ find . -exec echo "§{}§" \; §.§ §./ß ä§ §./a b§ §./"foo" and "bar"§ §./a b§ b§a §./foo; ls -rf§ dh@slarty[3]:/tmp/test/kranke_dateinamen (0)$ [jup, das listing ist wohl ok fuer ein '-exec echo' ;)] find muss ja die Dateinamen auch irgendwie richtig getrennt durch '\0' in die pipe schreiben geben koennen, also sowieso schon die Dateinamen korrekt trennen... -dnh PS: ja, ich weiss, ich muss da mal wieder ein paar mehr, fiesere Dateien anlegen ;)) PPS: Oh, good sigmonster! -- Netscape als root auszufuehren ist das Aequivalent zum Betreten des Innenhofes eines Hochsicherheitstrakts zur Pausenzeit, sich die Hosen runterzuziehen, weit nach vorn zu beugen und zu bruellen: "Los Jungs, holt es euch!". Oder Windows zu benutzen. [Wolfgang Weisselberg in suse-linux]
Vielen Dank, die Antworten haben mir bereits sehr geholfen. Gruss, Andreas Andreas Schlegel wrote:
Hallo,
ich benötige die Syntax um diverse Dateien nach einem String durchsuchen zu lassen. Klar das geht z.B. mit fgrep o.ä. ... Ich bekomme das aber nur hin, wenn die Datei oder die Dateien angebe. Da aber ein ganzer Verzeichnisbaum durchsucht werden soll, habe ich hiermit ein Problem. Wie kann ich das also kombinieren? Wäre toll, wenn mir jemand die Kommandos mailen könnte.
Gruss, Andreas
participants (7)
-
Andreas Schlegel
-
B.Brodesser@t-online.de
-
David Haller
-
Jan.Trippler@t-online.de
-
Jürgen Vollmer
-
patrick_hess@t-online.de
-
Thomas Hertweck