【エックスアーグズ】

xargs とは?

最終更新:
💡 標準入力の項目を、実行するコマンドの引数にする

標準入力で受け取った項目をコマンドの引数に組み立て、実行するコマンド。入力をまとめたり分割したりして1回以上実行する。通常は空白・改行や引用の規則で区切るため、空白などを含むファイル名を扱う場合はNUL区切りの入力と-0を組み合わせる。

📌 このページのポイント
入力の項目をコマンドの引数へ 標準入力 a b.txt c.txt NULで区切る xargs -0 printf 引数:a b.txt 引数:c.txt 1回に1項目の例
GNU版で-0 -r -n 1を使う例。空白入りの名前もNUL区切りなら1項目として引数にできる。printfで表示するだけで、ファイルの削除や変更は行わない。
ひよこ ひよこ
パイプだけでは足りないの?
ペンギン先生 ペンギン先生
パイプは出力を次のコマンドの標準入力へ渡すよ。ファイル名などを引数として受け取るコマンドに一覧を渡したいとき、xargsで引数に組み立てられる。標準入力と引数は別の受け取り口なんだ。
ひよこ ひよこ
簡単な例は?
ペンギン先生 ペンギン先生
GNU xargsの例なら、`printf '%s\0' 'a b.txt' 'c.txt' | xargs -0 -r -n 1 printf '%s\n'` で名前を表示できるよ。NULで区切った2項目を、1回につき1項目ずつ渡すので、空白入りのa b.txtも1つの名前として表示される。
ひよこ ひよこ
普通の改行区切りではだめ?
ペンギン先生 ペンギン先生
既定では空白・改行で区切り、引用符やバックスラッシュにも意味があるよ。名前自体にそうした文字が含まれると意図と違って分かれる場合がある。ファイル一覧なら `find` の `-print0` とxargsの `-0` を組み合わせる方法があるんだ。
ひよこ ひよこ
-rや-Iは何?
ペンギン先生 ペンギン先生
ここで使ったGNU版の `-r` は入力が空なら実行しない指定だよ。GNU版の既定では空でも1回実行する。`-I` は指定した置換文字列の位置へ項目を入れる用途で、単純に末尾へ引数を追加する動作と区別しよう。環境の実装や対応オプションも確認してね。
ひよこ ひよこ
並列なら必ず速い?
ペンギン先生 ペンギン先生
GNU版では `-P 4` で最大4プロセスを同時に実行できるよ。`-n` などで複数の実行へ分けて使う。ただし処理や資源によって効果は変わり、出力の順番も保証されない。共有ファイルへ同時に書く場合などは競合にも注意しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「xargs」って出てきたら「標準入力の項目を、実行するコマンドの引数にする」と思えばだいたいOK!
📖 おまけ:英語の意味
「xargs」 = 入力から引数を組み立てるコマンド名
💬 argsはarguments(引数)を表す略語だよ。標準入力で渡された一覧を、別のコマンドへ渡す引数に組み立てる働きを名前と結び付けて覚えよう。

参考資料

← 用語集にもどる