Das Unix- find(1)
Dienstprogramm ist sehr nützlich, damit ich eine Aktion für viele Dateien ausführen kann, die bestimmten Spezifikationen entsprechen, z
find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;
Mit den oben genannten Schritten wird möglicherweise ein Skript oder Tool für jede XML-Datei in einem bestimmten Verzeichnis ausgeführt.
Angenommen, mein Skript / Programm benötigt viel CPU-Zeit und ich habe 8 Prozessoren. Es wäre schön, bis zu 8 Dateien gleichzeitig zu verarbeiten.
GNU make erlaubt die parallele Verarbeitung von Jobs mit dem -j
Flag, find
scheint jedoch keine solche Funktionalität zu haben. Gibt es eine alternative generische Job-Scheduling-Methode, um dies zu erreichen?
-P
Option!xargs -P
- es hat einen nie behobenen Fehler, die Ausgabe zu verstümmeln (im Gegensatz zuparallel
), wenn 2 Threads genau zum gleichen Zeitpunkt eine Ausgabe erzeugen ...GNU parallel kann auch helfen.
Beachten Sie, dass ohne das
-j8
Argumentparallel
standardmäßig die Anzahl der Kerne auf Ihrem Computer verwendet wird :-)quelle
Keine Notwendigkeit zu "reparieren"
find
- machen Sie Gebrauch von sichmake
selbst, um die Parallelität zu handhaben.Lassen Sie Ihren Prozess eine Protokolldatei oder eine andere Ausgabedatei erstellen und verwenden Sie dann ein Makefile wie das folgende:
und so aufgerufen:
Besser noch, wenn Sie sicherstellen, dass die Ausgabedatei erst nach erfolgreichem Abschluss des Java-Prozesses erstellt wird, können Sie die
make
Abhängigkeitsbehandlung nutzen, um sicherzustellen, dass beim nächsten Mal nur nicht verarbeitete Dateien verarbeitet werden.quelle
Suchen hat eine parallele Option, die Sie direkt mit dem Symbol "+" verwenden können. Keine Xargs erforderlich. Wenn Sie es mit grep kombinieren, kann es schnell nach Streichhölzern suchen. Wenn ich zum Beispiel nach allen Dateien in meinem Quellverzeichnis suche, die die Zeichenfolge 'foo' enthalten, kann ich sie aufrufen
find sources -type f -exec grep -H foo {} +
quelle
-exec command +
Syntax es nicht parallel ausführt, sondern viele Dateien "gruppiert" und den Befehl mit mehreren Dateien als Argumente gleichzeitig ausführt. Es kommt vor, dass grep seine Ziele parallel durchsehen kann.