覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Linux - bashワンライナーループ(seq + xargs)

bashのワンライナーループを seqxargs を使って書く方法です。


上記は for でやってましたが、それを seqxargs に置き換えたものです。


基本的に以下で実行できます。{n} 部分が実行回数です

seq {n} | xargs -I@ sh -c '<something command>'

or

seq {n} | xargs -L 1 sh -c '<something command>'


10回コマンドを実行するなら以下のような感じ

seq 10 | xargs -I@ sh -c '<something command>'


例えば10個のディレクトリ(dir1~dir10)を作成するなら以下のような感じ

seq 10 | xargs -I@ sh -c 'mkdir dir@'


例えば100個のファイル(file1.txt~file100.txt)を作成するなら以下のような感じ

seq 100 | xargs -I@ sh -c 'echo "@" > file@.txt'


並列処理

xargs-P {並列プロセス数} の指定で 並列処理にすることが可能です。

たとえば以下のような時間を要する処理がある場合

seq 4 | xargs -I@ sh -c 'mkdir dummy_dir@; sleep 2'


-P を使って並列処理にすることができます

seq 4 | xargs -P 4 -I@ sh -c 'mkdir dummy_dir@; sleep 2'


各実行結果(time コマンドで計測)

並列化しなかった場合

$ time seq 4 | xargs -I@ sh -c 'mkdir dummy_dir@; sleep 2'

real    0m8.050s
user    0m0.013s
sys     0m0.019s

並列化した場合

$ time seq 4 | xargs -P 4 -I@ sh -c 'mkdir dummy_dir@; sleep 2'

real    0m2.019s
user    0m0.013s
sys     0m0.022s


並列化によって処理時間が短くなっていることがわかります。


備考・注意

  • for でやる場合に比べて、実行する内容によっては今回のやり方の方が圧倒的に遅くなる可能性があります
  • 私がxargs を使い慣れていないので、ここに記載した内容で対応しきれないケースもあるかもしれません