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
することがこんな短い記述で可能です。
それでは今日はここまで。
またよろしくお願いします。