bashのワンライナーループを seq
と xargs
を使って書く方法です。
上記は for でやってましたが、それを seq
と xargs
に置き換えたものです。
基本的に以下で実行できます。{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
を使い慣れていないので、ここに記載した内容で対応しきれないケースもあるかもしれません