xargsでお手軽並列処理

2 min read

こんにちは、無能です。
久しぶりの投稿になって申し訳ないのですが生きています。

Ryzen 5を中古で買ったらまさかのピン折れしていて、メモリ一枚しか認識しなかったりして事件もありましたがなんとか生活しています。
AM4マザーを格安でもう一枚M-ATXのもの手に入れたので、そのRyzen石はミニPC機として組むのに使おうかなと思っています。

便利なxargs

xargs - Wikipedia
UNIXコマンドとして存在するxargsですがとても便利です。
最初は使いなれなかったのですが使えば使うほど可用性が見つかるとてもよいコマンドであり、ワンライナーでシンプルなループ文を書く手間さえ必要ありません。

Use Case

例えば、yt-dlpで動画保存したいものがあるとして行ごとに存在するとします。

url1
url2
url3

流石に一括並列処理に渡してしまうとCPU負荷が激しくなるので、これを2プロセスずつ動かしたいのであれば以下のように記述できます。

cat url-txt | xargs -I {} -P 2 yt-dlp {}

なんとこれだけで2プロセスづつ処理することができてしまいます。

解体しましょう

さて、これはどう動いているでしょうか?
上記は以下と同義です

yt-dlp url1 ; yt-dlp url2
yt-dlp url3

仕組み的には実行ごとにxargsに渡したコマンドを都度実行していることになります。
read lineして配列として格納しているようなイメージでしょうか。

オプションなしの場合は?

オプションなしならば、一括にxargsに渡したコマンドに与えます。
対応するコマンドは限られるので、-Iオプションを使ったほうがよい気がします。
以下のような場合

cat url-txt | xargs yt-dlp

この場合、以下のコマンド実行したことになります。

yt-dlp url1 url2 url3

なので、できる限り-Iで処理したほうが良さそうですが、要所によってオプションなしでも良さそうです。

Use Case2

findコマンドで特定のファイル名のみをgrepしたかったり、sedしたかったりするときにも便利です。

find . -name "testfile" | xargs -I {} grep "return 0" {}

こんな感じで、特定のファイルだけをgrepすることがこんな短い記述で可能です。


それでは今日はここまで。
またよろしくお願いします。

PGP --- Contact --- Machines