👨‍👩‍👧‍👦

xargsでお手軽並行処理

2022/12/14に公開

はじめに

こんにちは!NE株式会社の tatsuo48 です。
今回はxargsコマンドについてまとめます。

xargsとは

「標準入力を読み込んでコマンドラインを作成し実行する」コマンドです。
https://linuxjm.osdn.jp/html/GNU_findutils/man1/xargs.1.html

例えば以下のように使います。

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