たくさんの.wavファイルを.mp3に変換するためのシェルスクリプトを書こうとしています。 「find」コマンドを使用してそれらを検索し、次に「lame」コマンドを使用して変換します。これには単純なforループを使用できますが、いくつかの並列プロセスを使用してこれを行う必要があります。
たとえば4のように、定義された数のプロセスが必要です。各プロセスでファイルの変換を開始します。 1つのファイルが1つのプロセスで変換を終了したら、次のファイルに置き換えます。これにアプローチする最良の方法は何ですか?
リストをxargs
に渡し、-n
および/または-P
オプションを使用して、任意の時点で実行されているプロセスの数を制御することをお勧めします。
make
はこれに適しています。 Makefile
のようなものが必要になります
%.mp3: %.wav
lame $(LAMEOPTS) $< $@
次に、ターゲットのリストを生成します。
$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: \1mp3/' >>Makefile
次に、make
にタスクをスケジュールするように指示します。
$ make -r -j4 -f Makefile
まだ誰もGNU並列について言及していないことに驚いています。それを使用すると、コマンドは次のように単純になります。
find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3
これにより、各入力ファイルの拡張子をmp3
に置き換えるように求められます。デフォルトでは、並列はマシン上のCPUと同じ数のジョブを実行しますが、-j <i>integer</i>
を使用して別の値を設定できます。スイッチ--dry-runは、実行されるコマンドを確認するのに役立ちます。
xjobs
がインストールされている場合、これはまさにそれが設計された種類のタスクであることがわかります。特に、-j
オプションの説明を確認して、作成されるプロセスの数を調整してください。