Bash-Skript zum Verarbeiten von Dateien mit mehreren Prozessen

896
sudo

Die meisten Bash-Skripte für die Batch-Dateibearbeitung können beschleunigt werden, indem mehrere Prozesse gestartet werden, um alle Kerne zu nutzen. Ich möchte ein Skript erstellen, das eine Reihe von Dateien verarbeitet, wobei die Anzahl der zu bearbeitenden Dateien gleichmäßig auf die Prozesse aufgeteilt wird. Wie mache ich das?

1

2 Antworten auf die Frage

4
Felipe Lema

Siehe GNU parallel, um Unterprozesse parallel zu starten. Hat eine ähnliche Syntax wie xargs. Aus den Dokumenten :

So komprimieren Sie alle HTML-Dateien mit gzip run:

find . -name '*.html' | parallel gzip --best

GNU Parallel scheint auf vielen Unix-Systemen (einschließlich OS X und Ubuntu Server) nicht vorinstalliert zu sein, aber es ist viel besser als die andere Methode, wenn Sie die Option haben, es zu installieren. Danke für den Tipp. sudo vor 9 Jahren 0
1
sudo

Ich weiß nicht, ob dies der schönste Weg ist, aber ich habe es mir ausgedacht.

Verwendungszweck: batch.sh [number of processes to use]

batch.sh:

end=$(( $1 - 1 )) for i in `seq 0 $end`; do echo Spawning helper $i of $end ./helper.sh $i $1 & done 

helper.sh:

n=$1 for file in ./*; do # Your code here v echo Processing file: $file # ^ n=$((n+1)) n=$((n%$2)) done 

Dies führt zu n Prozessen, bei denen jeder eine Datei verarbeitet und dann (n - 1) Dateien überspringt. Process (i mod n) verarbeitet die i-te Datei.