xargs コマンド

ファイル名の一覧を標準入力から受け取って、そのファイル一覧を任意のコマンドに引数として渡すコマンド。(ファイル名でなくてもよい)

以下のコマンドの例では、 finda.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 に渡す場合は要注意

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 に移動することになってしまい、ほとんどのファイルの中身が破壊されてしまう。

一度にコマンドに渡す引数の最大数を制御するには

-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
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。