Hierfür gibt es zwei einfache Lösungen. Grundsätzlich mit xargsoder parallel.
xargs Ansatz:
Sie können xargsmit findwie folgt verwenden:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Wobei Sie number_of_processesdurch 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, xargsmöglicherweise nicht genügend viele Prozesse für diese gestartet werden. Eine Lösung besteht darin, mit der -nOption für xargsanzugeben, wie viele Argumente gleichzeitig aus der Pipe entnommen werden sollen. Die Einstellung -n1erzwingt 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 -nWert besser. Daher kann die -nOption 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+1parallel 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 xargsdie Reihenfolge der Ausgabe von jedem Prozess beibehalten und eine zusammenhängende Ausgabe generiert wird. Beispiel: xargsWenn Prozess 1 eine Zeile generiert, z. B. p1L1Prozess 2 eine Zeile generiert p2L1, Prozess 1 eine weitere Zeile generiert, lautet p1L2die Ausgabe:
p1L1
p2L1
p1L2
während mit parallelder Ausgabe sollte sein:
p1L1
p1L2
p2L1
Dies ist normalerweise nützlicher als die xargsAusgabe.