xargs -P max-procs
を使えば、同時実行プロセス数を指定して、並列処理ができる。
max-procsが0の時、できるだけ多くのプロセスを起動する。1以上の時は、その数のプロセスを起動する。
例:lsの結果を1つずつsomecommandに渡し、8並列で動かす。
$ ls | xargs -P 8 -n 1 somecommand
-P 8
で8並列実行を行う。
-n 1
でsomecommandに渡す引数を最大1つにしている。somecommandが何個の引数をとれるのか、あるいは必要とするのかによって、数値を設定する。
例:filenameに入っている各行をechoに渡し、引数の順番を変えて後ろに[改行]という文字をつけ、ランダムに表示する。
$ xargs -a filename -P 0 -d '\n' -I {} echo {}[改行]
2行目の文字列[改行]
1行目の文字列[改行]
6行目の文字列[改行]
4行目の文字列[改行]
5行目の文字列[改行]
3行目の文字列[改行]
-P 0
でできるだけ多くのプロセスを起動する。
-I {}
で引数を{}
にバインドしてくれる。{}
の代わりに%
でもOK。
-I
をつけると、スペースで区切られず改行のみで区切られるようになるが、空行が表示されなくなる。
空行が表示されなくなるのは、-I
をつけると-x
と-L 1
が自動でつけられ、-L
は空行を使用しないため。
-L 1
がつけれられ、1コマンドラインにつき最大1行の入力行を使用するため、-n 1
は機能が被るので不要。
-n
も-L
も空白は無視するが、-d
でdelimiterを指定すれば、空行でも表示できる。(指定された文字以外のあらゆる文字が文字通りに解釈され、ファイル終端文字列も無効になるため)
スペースでも改行でも区切りたければ、はじめに-d ' ' -n 1
で一つずつスペースで区切ったものを、改めてxargsに渡せばいい。
$ xargs -a filename -d ' ' -n 1 | xargs -P 8 -d '\n' -I {} echo {}[改行]