Hi,
Na? Wieder zurück im Trott?
Bist Du so braun geworden oder ist das Rost?
Ja, is' ja schon gut, ich hör' ja schon auf.
Wenn mehr als nur eine Handvoll Dateien durchsucht werden sollen wäre
'find' zu empfehlen:Ja, aber…
Ja, das gibt's natürlich viele "aber" ;-)
find /verzeichnis/in/dem/gesucht/werden/soll -type f -exec grep -q Suchbegriff {} ; -print
… nicht so!
Ist die einfachste Möglichkeit, da wir hier einen Anfänger vor uns haben. Ich nehme hier zumindest einen Anfänger an, da 'grep' nun wirklich zum Grundwissen gehört.
Der Overhead des Prozeßspawnings ist auch nicht so groß, das er nur bei wirklich schnellen Platten oder sehr kleinen Dateien und großen Plattencache merklich in's Gewicht fallen würde.
Aber das kann man ja aml ausprobieren. Bei mir werkelt relativ lahmes Geraffel mit 'nem Duron-1200 und 'nem halbem GiB RAM. Testbed ist, wie kann es anders sein: SELFHTML-8.1.
$ time find ./selfhtml81 -type f -exec grep -q DOCTYPE {} ; -print > /dev/null
real 0m18.798s
user 0m5.180s
sys 0m5.090s
sync && hdparm -f /dev/hda
$ find ~/misc-docs >/dev/null # clear caches "brute force"
$ time find ./selfhtml81 -type f -print | xargs grep -lZ -H DOCTYPE | tr '\0' '\n' > /dev/null
real 0m1.694s
user 0m0.100s
sys 0m0.210s
Ja gut, hast ja Recht!
;-)
Damit wird für jede Datei ein neues grep gestartet, völlig
unnötigerweise! So macht man es besser:find . -type f -print0 | xargs -0 grep -lZ -H "pattern" | sed 's!\0.*$!!'
Damit werden genau vier Prozesse gestartet: find, xargs, grep und sed
Naja, wenn's nur darum ginge würde ich eh Perl anschmeißen, das wäre dann nur ein einziger Prozeß bzw so viele/wenige, wie man bestimmt. Zudem müßte ich bei Deinem Vorschlag mindestens in die Manpage von 'xargs' schauen, da ich das zu selten nutze. Und da ich eine ausgesprochen faule Sau bin ... ;-)
Das mit sed funktioniert bei mir übrigens gar nicht (Version 3.02), die mag keine \x00, auf welche Weise auch immer; ob nun geflüchtet, dezimal, hexadezimal oder octal: alles scheißegal, nix will sie.
so short
Christoph Zurnieden