【エックスアーグズ】

xargs とは?

💡 パイプの出力を「引数」に変換する、コマンド同士の橋渡し役
📌 このページのポイント
xargs の役割:標準入力 → 引数 への変換 パイプだけだと... find の結果 | rm ... rmは標準入力を読まない → 削除されない xargs を使うと find の結果 | xargs rm 標準入力を引数に変換 → 削除される! find . -name "*.tmp" | xargs rm の流れ find a.tmp b.tmp c.tmp xargs 入力→引数に変換 rm a.tmp b.tmp c.tmp 引数として渡される
xargsによる標準入力から引数への変換イメージ
ひよこ ひよこ

xargsって何のためにあるの?パイプだけじゃダメなの?

ペンギン先生 ペンギン先生

パイプは「標準入力」にデータを流すんだけど、コマンドによっては標準入力じゃなくて「引数」としてデータを受け取りたいものがあるんだよ。xargsはその橋渡しをしてくれるんだ

ひよこ ひよこ

たとえばどんなときに使うの?

ペンギン先生 ペンギン先生

find . -name '*.tmp' | xargs rm」だと、findで見つけたファイル一覧をrmの引数に渡して一括削除できるよ。パイプだけだとrmは標準入力を読まないから削除されないんだ

ひよこ ひよこ

ファイル名にスペースが入っていたらどうなるの?

ペンギン先生 ペンギン先生

いい質問だね!スペースが入ると区切りと誤認されて壊れるんだ。その対策として「find . -name '*.tmp' -print0 | xargs -0 rm」と、ヌル文字で区切る方法があるよ。-print0と-0はセットで覚えてね

ひよこ ひよこ

もっと複雑な使い方もできるの?

ペンギン先生 ペンギン先生

「-I {}」を使うと引数の位置を自由に指定できるよ。たとえば「ls *.txt | xargs -I {} cp {} backup/」で各ファイルをbackupフォルダにコピーできるんだ。さらに「-P 4」で4並列実行もできて、大量ファイルの処理を高速化できるよ。xargsを使いこなせるとシェルスクリプトのレベルが一段上がるね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「xargs」って出てきたら「標準入力を引数に変換してコマンドに渡すツール」と思えればだいたいOK!
📖 おまけ:英語の意味
「extended arguments」 = 拡張引数
💬 「extended arguments(拡張引数)」の略で、標準入力からの引数を「拡張」してコマンドに渡す仕組みだよ
← 用語集にもどる