Ich suche alle Dateien, die ein Wort enthalten.
Beispiel.
Vor 3 Monaten (oder 5 Wochen) schrieb ich etwas über Tiere. Die Datei heisst irgendwas mit tier am Anfang und das Wort hase ist darin.
Nun Tutorial sagt:
grep -n ‚halo‘ datei.txt
und ich gebe ein:
grep -r ‚hase‘ tier*.txt >ergebnis.txt,
aber es kommt nur Fehlermeldung:
Datei oder Verzeichnis nicht gefunden.
Linux soll HD ganz durchsuchen.
Ich würde ja zumindest noch dazu schreiben, was da passiert.
Das Problem ist folgendes:
grep -r 'hase' * schaut sich alles im aktuellen Verzeichnis an. Findet es Dateien, durchsucht es sie nach „hase“. Findet es Ordner, geht es wegen -r dort ein, und sucht auch darin.
grep -r 'hase' tier*.txt schaut sich alles im aktuellen Verzeichnis an, was dem Mustertier*.txtentspricht, und lässt alles andere links liegen. Solange ein Unterordner nicht auch zufällig tierGiraffe.txt heißt, wird der auch nicht beachtet. Deshalb findet grep nichts.
Deine Lösung besteht aus zwei Schritten:
find / -type f listet ab dem Wurzelverzeichnis (/) rekursiv alles auf, was ne Datei ist (-type f)
Diese Liste wird an xargs übergeben, welches für jede Datei in der Liste den Befehl grep -r 'hase' {Datei} aufruft.
Dazu zwei Anmerkungen:
find / -type f findet ALLE Dateien, egal, ob Bilder, Binärdateien oder Textdateien. Die dann alle von grep durchsuchen zu lassen, dauert Jahre, und liefert viele falsche Treffer.
Mit find / -type f -iname 'tier*.txt' werden nur die Dateien gefunden, die dem Muster entsprechen.
Das -r wird für grep nicht mehr benötigt, da es ja die Dateinamen einzeln bekommt. Funktionell wird das keinen Unterschied machen, aber möglicherweise macht es die Sache langsamer.
heißt also:
find / -type f -iname 'tier*.txt' | xargs grep 'hase'
(Nebenbei wird so auch z.B. /usr durchsucht. Das Verzeichnis ist riesig, das Durchsuchen dauert also lange. Und da sind garantiert keine Dokumente drin. ggf sucht man statt in / zunächst besser in ~. )
Ja. Wie gesagt, der Filter tier*.txt in grep behandelt nur Dateien und Ordner, die auf dieses Muster passen. Demnach werden Ordner, die nicht z.B. tierGiraffe.txtheißen, komplett ignoriert, und auch nicht weiter durchsucht. find arbeitet da anders.
Doch, das hast du richtig verstanden. Aber wie gesagt, dieser Filter wird auch auf den Ordnernamen angewandt. Ist ziemlich bescheiden, wenn du mich fragst.
Es ist nicht so einfach möglich, eine zip-Datei wie einen Ordner zu behandeln, wenn du das meinst.
Man kann auf der Kommandoszeile mit unzip -l MeineZipdatei.zip ausgeben, welche Dateien überhaupt drin sind, das nach dem Muster durchsuchen, und nur, wenn dieses Muster auch drin ist, entpacken und durchsuchen. Wenn jedes ZIP entpacket wird, dauert es wieder ewig.
Nein, sondern nur dann, wenn der Filter mehr als nur * ist.
grep nimmt an sich nur Dateien, -r ist eine Erweiterung von GNU grep, wozu auch immer. Meine Shell ist zsh, deshalb mache ich solche find-Arien einfach mit Globbing: