👨👩👧👦
xargsでお手軽並行処理
はじめに
こんにちは!NE株式会社の tatsuo48 です。
今回はxargsコマンドについてまとめます。
xargsとは
「標準入力を読み込んでコマンドラインを作成し実行する」コマンドです。
例えば以下のように使います。
test.txt
a
b
c
$ cat test.txt | xargs -I {} echo hello {}
hello a
hello b
hello c
オプション1つで並行処理
これだけでも便利ですが、さらに強力なのがオプション1つで並行処理までできてしまうことです!
例えば、以下のように実行すると逐次実行だと合計6秒かかっています。
test.txt
1
2
3
$ time cat test.txt |xargs -I {} sleep {}
________________________________________________________
Executed in 6.07 secs fish external
usr time 13.29 millis 0.24 millis 13.04 millis
sys time 28.66 millis 3.45 millis 25.21 millis
これに -P 並行数
のオプションをつけると並行実行されるため、3つのうち、最も長い3秒で全ての処理が終わります。
$ time cat test.txt |xargs -I {} -P 3 sleep {}
________________________________________________________
Executed in 3.04 secs fish external
usr time 10.86 millis 0.21 millis 10.65 millis
sys time 19.37 millis 2.61 millis 16.77 millis
使用例
複数のディレクトリで同じ処理がしたい
例えばterraform plan
など
dir.txt
staging
production
$ cat dir.txt | xargs -I {} cd {};terraform init;terraform plan
Teamに紐づくGitHubリポジトリの権限を一括で変更したい
repo.txt
repo-a
repo-b
repo-c
APIリクエストならある程度並行処理でも大丈夫なので -P
使う。
$ cat repo.txt | xargs -I {} -P 3 gh api --method PUT \
-H "Accept: application/vnd.github+json" \
/orgs/org名/teams/team名/repos/owner名/{} \
-f permission='push'
まとめ
簡単にですがxargsコマンドについてまとめてみました。
これ一つ覚えているだけで作業効率が格段に上がります。みなさんもぜひ使ってみてください〜
Discussion