web-dev-qa-db-ja.com

パターンに一致する複数のファイルに対して並列にコマンドを実行します

ファイルパスである単一の引数を受け入れるコマンドがあるとしましょう。

mycommand myfile.txt

ここで、このコマンドを複数のファイルに対して並行して実行したいと思います。具体的には、ファイルマッチングパターンmyfile*

これを達成する簡単な方法はありますか?

2
vonPetrushev

GNU xargsと、プロセス置換をサポートするシェルを使用

_xargs -r -0 -P4 -n1 -a <(printf '%s\0' myfile*) mycommand
_

最大4mycommandsを並行して実行します。

mycommandがそのstdinを使用しない場合は、次のこともできます。

_printf '%s\0' myfile* | xargs -r -0 -P4 -n1 mycommand
_

これは、最新のBSDのxargsでも機能します。

_myfile*_ファイルを再帰的に検索するには、printfコマンドを次のように置き換えます。

_find . -name 'myfile*' -type f -print0
_

(_-type f_は通常のファイル専用です。globと同等の場合は、zshとそのprintf '%s\0' myfile*(.)が必要です)。

8

ループの使用:

for f in myfile*; do
  mycommand "$f" &
done

wait

または GNU parallel を使用します。

7
cuonglm

GNU Parallelを使用すると、次のようになります。

parallel mycommand ::: myfile*

コアごとに1つのジョブを実行します。

GNU Parallelは一般的な並列処理機能であり、同じマシン上またはsshアクセスできる複数のマシン上でジョブを簡単に並列実行できます。多くの場合、forループを置き換えることができます。

4つのCPUで実行する32の異なるジョブがある場合、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

Simple scheduling

代わりに、GNU Parallelは、終了時に新しいプロセスを生成します。つまり、CPUをアクティブに保ち、時間を節約します。

GNU Parallel scheduling

インストール

GNU Parallelがディストリビューション用にパッケージ化されていない場合は、rootアクセスを必要としない個人インストールを実行できます。これを行うことで10秒で実行できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、 http://git.savannah.gnu.org/cgit/parallel.git/tree/README を参照してください。

詳細

その他の例を参照してください: http://www.gnu.org/software/parallel/man.html

イントロビデオを見る: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルをウォークスルーします: http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるためにメーリングリストにサインアップしてください: https://lists.gnu.org/mailman/listinfo/parallel

2
Ole Tange