Jedes Mal, wenn es eine Zeile darin findet message-id
, schreibt es sie bald darauf messageids.txt
. Und jedes Mal, wenn eine Zeile message-id
darin geschrieben wird, messageids.txt
wird sie schnell gefunden. Das ist also eine triviale Endlosschleife.
Warum ist find exec grep> file eine Endlosschleife?
Ich habe versucht, alle Message-ID: Header (Zeilen) in einem Verzeichnis mit 200K .eml-Dateien (Nur-Text) zu sammeln. Ein bisschen naiv sagte ich:
find -type f -exec grep -Fi "message-id:" {} \; > messageids.txt
Ich ließ es über Nacht laufen, da ich dachte, es würde eine Weile dauern, bis ich so viele Dateien durchforstete. Ein bisschen zu meiner Überraschung heute morgen ist messageids.txt 1.7 TB und meine Partition ist voll. Mir ist klar, dass das, was passiert sein muss, ist, dass die eigene Ausgabe von grep als Eingabe aufgegriffen wird, aber ich würde nicht (und würde es auch immer noch nicht intuitiv erwarten), dass sich dies endlos wiederholt. Was bedeutet, dass mein Verständnis der Kräfte nicht so stark ist, wie es sein sollte.
Kann jemand eine detaillierte Erklärung dazu liefern, wie der Befehl oben funktioniert und warum diese Endlosschleife erwartet werden sollte (nehme ich an)? Vielen Dank.
Update: Ich erwarte, dass es funktioniert, dass find eine Liste von Dateien findet und auf jeder von ihnen grep heißt. Irgendwann wird grep auf messageids.txt aufgerufen. Wenn ich dies beispielsweise für einen Sortierbefehl ausführen würde, würde messageids.txt erstellt, sobald der Befehl ausgeführt wird (möglicherweise wird er geknackt, falls er bereits vorhanden war), er wurde jedoch nicht gefüllt, bis der Befehl ausgeführt wurde. In diesem Fall muss, damit die Schleife unendlich ist, die Datei gefüllt werden, bevor die Ausgabe abgeschlossen ist, jedoch auf eine Weise, dass die Eingabe von grep ständig aufrechterhalten wird. Das ist der Punkt, der sich nicht so verhält, wie ich es erwartet hätte, und ich hoffte auf eine detaillierte Erklärung, wie diese Prozesskette abläuft, damit ich meine Linux-Grundlagen festigen kann.
2 Antworten auf die Frage
Ich habe gerade so etwas getestet und es hat funktioniert.
for f in $(find . -type f); do grep -Fi "message-id:" $f > messageids.txt; done
Verwandte Probleme
-
9
Was ist der Unterschied zwischen den Befehlen "su -s" und "sudo -s"?
-
4
Gutes freies Ubuntu Server-VMWare-Image benötigt
-
4
Was sind die Unterschiede zwischen den großen Linux-Distributionen? Werde ich es merken
-
2
Begrenzung der CPU-Auslastung für Flash in Firefox?
-
2
Wie kann ich mein Mikrofon unter Debian GNOME zum Laufen bringen?
-
2
Conky-Setups - Beispiele / Ideen?
-
3
Was sind die Unterschiede zwischen Linux Window Managern?
-
2
ThunderBird / Lichtsynchronisation mit SE k770i
-
4
Linux-Dateisystem
-
6
Vollbild-Flash langsam in KDE 4