基本的な使い方
xargs
は以下のように記述することで前のコマンドの実行結果を標準入力から受け取って、次のコマンドの引き数に渡して実行できます。
find . -name "*.log" | xargs rm -fv
上記の場合にはfind
コマンドで取得したすべてのファイルパスに対してrm
コマンドが実行されます。
以下のようなコマンドが実行されます。
rm -fv ./path/to/sample1.log ./path/to/sample2.log ./path/to/sample3.log
ドライラン
-p
をつけると実際にはコマンドは実行されず実行される予定のコマンドの内容が出力されます。
$ find . -name "*.log" | xargs -p rm -fv
rm -fv ./path/to/sample1.log ./path/to/sample2.log ./path/to/sample3.log?...
引数の位置を指定
以下のように記述することで引数の位置を指定できます。
find . -name "*.log" | xargs -i cp {} /exampledir/
以下のようなコマンドが実行されます。
cp ./path/to/sample.log /exampledir/
また以下のように記述しても上記と同様のことが実現できます。
find . -name "*.yml" | xargs -IXXX cp -f XXX ./exampledir/
引数の最大数を指定
-L 数値
を追記するとコマンドに一度に渡す引数の最大数を指定できます。
find . -name "*.log" | xargs -L 1 rm -fv
上記の場合にfind
コマンドで3つのパスを取得したとすると以下のように実行されます。
$ rm -fv ./path/to/sample1.log
$ rm -fv ./path/to/sample2.log
$ rm -fv ./path/to/sample3.log
なお-L 数値
は改行ごとに1つの引数として扱います。
-n 数値
でも引数の数を指定できますがこちらはxargs
がコマンドに渡す引数の最大数を指定します。
$ seq -s ' ' 10 | xargs -L 2 echo T
T 1 2 3 4 5 6 7 8 9 10
$ seq -s ' ' 10 | xargs -n 2 echo T
T 1 2
T 3 4
T 5 6
T 7 8
T 9 10
同時実行の最大数を指定
-P 数値
を追記すると同時実行の最大数を指定できます。
find . -name "*.log" | xargs -L 1 -P 2 rm -fv
上記の場合にfind
コマンドで3つのパスを取得したとすると1つ目と2つ目が同時実行されその後に3つ目が実行されます。