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