xargs コマンド 2014/01/05
ファイル名の一覧を標準入力から受け取って、そのファイル一覧を任意のコマンドに引数として渡すコマンド。(ファイル名でなくてもよい)
以下のコマンドの例では、
find
で a.txt b.txt dir/c.txt dir/d.txt
が出力されるとすると、それがそのまま cat
に引数として渡され、
cat a.txt b.txt dir/c.txt dir/d.txt
が実行される。
find . -type f | xargs cat
find
の結果が多すぎて一度に引数として渡しきれない場合は、引数が分割され、cat
が複数回実行される。
mv
に渡す場合は要注意
2013/06/11
xargs
は、コマンドの最後にファイル名を引数として渡すため、
mv
に渡すには mv -t
とする必要がある。
find . -type f | xargs mv -t ~/dst
-t
を与えないと mv ~/dst a.txt b.txt dir/c.txt dir/d.txt
のようになって、
dir/d.txt
に移動することになってしまい、ほとんどのファイルの中身が破壊されてしまう。
一度にコマンドに渡す引数の最大数を制御するには 2014/01/05
-n
オプションを使って最大数を設定できる。
例えば、-n 3
とすると、コマンドに最大で3つまでしか引数を渡さず、
4つ以上ある場合はコマンドを複数回実行される。
ディレクトリに a.txt
, b.txt
, c.txt
, test.sh
があって、
test.sh
が以下の内容とし、
echo "exec: test.sh"
echo "$@"
以下を実行すると、
ls | xargs sh test.sh
以下のように出力される
exec: test.sh
a.txt b.txt c.txt test.sh
-n
オプションで最大1に設定すると、
ls | xargs -n 1 sh test.sh
以下のように出力される
exec: test.sh
a.txt
exec: test.sh
b.txt
exec: test.sh
c.txt
exec: test.sh
test.sh
-n
の後ろに空白を入れなくてもよい。
ls | xargs -n1 sh test.sh