xargs 標準入力から受け取った文字列を、コマンドの引数にして実行する
xargs [オプション] [コマンド [初期引数]]試してみる
cat items.txt | xargs入力の行を、1行の引数にまとめます。コマンドを省くと echo が使われます。
cat items.txt | xargs -n 2-n 2 で、2個ずつの引数にして実行します。
find logs -name '*.log' -print0 | xargs -0 grep -l errorファイル名に空白があっても安全なように、NULで区切って渡します。error を含むファイルが分かります。
ls tmp | xargs -I{} echo remove {}-I で、入力の1項目ごとに、{} を置き換えてコマンドを実行します。
find tmp -name '*.tmp' | xargs rm -v見つけたファイルをまとめて削除します。
echo a b c | xargs -t echo-t で、実行するコマンドを標準エラー出力に表示します。
主なオプション
-n 数 | 1回の実行に渡す引数の最大数 |
|---|---|
-I 文字列 | 文字列を入力1項目で置き換えて、項目ごとに実行する |
-0 | 入力をNUL文字区切りとして読む(find -print0 と組み合わせる) |
-t | 実行するコマンドを表示する |
-P 数 | 同時に実行するプロセス数 |
-r | 入力が空のときは実行しない(GNU版) |
解説
基本
xargs は、標準入力で受け取った文字列を、指定したコマンドの引数に変換して実行します。パイプは標準入力にしか渡せないので、rm や grep のように、引数でファイルを受け取るコマンドへ渡したいときに使います。
find との組み合わせ
find ... | xargs コマンド は定番の形です。ただし、ファイル名に空白や改行があると、区切りを間違えます。find -print0 | xargs -0 と書くと、NUL文字で区切るので、安全です。
引数の数と置換
入力が多いと、コマンドを複数回に分けて実行します。-n で1回あたりの数を指定できます。-I {} を使うと、入力の1項目ごとに1回ずつ実行し、{} の位置に項目を入れられます。引数の途中に差し込みたいときに使います。
入力が空のとき
GNU版の xargs は、入力が空でも、コマンドを1回実行します。避けるには -r を付けます。
引用符
標準では、空白区切りで読み、引用符やバックスラッシュを解釈します。意図しない解釈を避けるために、-0 や -d '\n' を使えます。