Hierfür gibt es zwei einfache Lösungen. Grundsätzlich mit xargs
oder parallel
.
xargs Ansatz:
Sie können xargs
mit find
wie folgt verwenden:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Wobei Sie number_of_processes
durch die maximale Anzahl von Prozessen ersetzen, die Sie starten möchten. Es wird jedoch nicht garantiert, dass Sie eine signifikante Leistung erhalten, wenn Ihre Leistung auf E / A beschränkt ist. In diesem Fall können Sie versuchen, weitere Prozesse zu starten, um die Wartezeit auf E / A-Vorgänge zu kompensieren.
Außerdem können Sie mit find erweiterte Optionen angeben, anstatt nur Dateimuster wie Änderungszeit usw. anzugeben.
Ein mögliches Problem bei diesem Ansatz ist, wie in den Kommentaren von Stéphane erläutert, dass wenn nur wenige Dateien vorhanden sind, xargs
möglicherweise nicht genügend viele Prozesse für diese gestartet werden. Eine Lösung besteht darin, mit der -n
Option für xargs
anzugeben, wie viele Argumente gleichzeitig aus der Pipe entnommen werden sollen. Die Einstellung -n1
erzwingt xargs
, dass für jede einzelne Datei ein neuer Prozess gestartet wird. Dies kann ein gewünschtes Verhalten sein, wenn die Dateien sehr groß sind (wie im Fall dieser Frage) und eine relativ kleine Anzahl von Dateien vorhanden ist. Wenn die Dateien selbst klein sind, kann der Mehraufwand beim Starten eines neuen Prozesses den Vorteil der Parallelität beeinträchtigen. In diesem Fall ist ein höherer -n
Wert besser. Daher kann die -n
Option je nach Dateigröße und Anzahl fein eingestellt werden.
Parallele Annäherung:
Eine andere Möglichkeit ist die Verwendung des Ole Tange GNU Parallel-Tools parallel
( hier verfügbar ). Dies bietet eine genauere Kontrolle über die Parallelität und kann sogar auf mehrere Hosts verteilt werden (wäre von Vorteil, wenn Ihr Verzeichnis beispielsweise gemeinsam genutzt wird). Die einfachste parallele Syntax ist:
find . -type f | parallel -j+1 grep mypattern
Wobei die Option -j+1
parallel anweist, einen Prozess zu starten, der die Anzahl der Kerne auf Ihrem Computer überschreitet (Dies kann hilfreich sein, wenn die Anzahl der E / A-Aufgaben begrenzt ist. Möglicherweise versuchen Sie sogar, die Anzahl zu erhöhen).
Parallel hat auch den Vorteil, dass xargs
die Reihenfolge der Ausgabe von jedem Prozess beibehalten und eine zusammenhängende Ausgabe generiert wird. Beispiel: xargs
Wenn Prozess 1 eine Zeile generiert, z. B. p1L1
Prozess 2 eine Zeile generiert p2L1
, Prozess 1 eine weitere Zeile generiert, lautet p1L2
die Ausgabe:
p1L1
p2L1
p1L2
während mit parallel
der Ausgabe sollte sein:
p1L1
p1L2
p2L1
Dies ist normalerweise nützlicher als die xargs
Ausgabe.