xargs 便利ですよね。
コマンドを明示的に1つずつ実行したり、ファイルをまとめて実行したり。実行する子プロセス数(スレッド)を指定できたり。
まとめて処理しているときにどこまで処理しているかを見ながらやってほしい
たとえば、rsync の場合だと rsync --progress
すると転送情強のファイル名が見れるじゃん。
同じように、今実行しているファイルがどれか、進捗をxargs でできると楽しそう。
オプション -t
次に実行するコマンドを表示してから実行してくれる -t を使うとできる
これで、表示がでるので何を実行しているのか確認ができる。
例
たとえば、画像を1000枚変換するときに、今何枚目を実行しているかわかる。
takuya@temp$ ls *.jpg | xargs -t -I@ -P 1 mogrify -crop 2886x3700+0+0 @ mogrify -crop 2886x3700+0+0 out-000.jpg mogrify -crop 2886x3700+0+0 out-001.jpg mogrify -crop 2886x3700+0+0 out-002.jpg mogrify -crop 2886x3700+0+0 out-003.jpg mogrify -crop 2886x3700+0+0 out-004.jpg mogrify -crop 2886x3700+0+0 out-005.jpg mogrify -crop 2886x3700+0+0 out-006.jpg mogrify -crop 2886x3700+0+0 out-007.jpg mogrify -crop 2886x3700+0+0 out-008.jpg mogrify -crop 2886x3700+0+0 out-009.jpg
例2
たとえば、フォルダに対して、なにか処理をして、その結果が必要なとき。 このときは、標準出力を分けてあげればいい。
takuya@tmp$ find -type f | xargs -I@ -P 5 -t md5sum @ >> md5-list.txt
もう ps をwatch しなくていい。
たくさんのファイルを処理中は、ps を見たりしてたんだけど、Verboseに今の実行コマンドをプリントして表示してくれるなら、めっちゃ便利。
2021-03-17
標準出力を分ける方法を追記
参考資料
https://stackoverflow.com/questions/842401/is-xargs-t-output-stderr-or-stdout-and-can-you-control-it