find -exec や xargs で引数の展開個数を制御する


ファイルが3つある状態。

ls
a.txt b.txt c.txt

1-1. find ... -exec ... \;

引数は1つずつコマンドに渡される。次の例だと echo が3回実行される。

find . -name '*.txt' -exec echo {} \;
./c.txt
./b.txt
./a.txt

1-2. find ... -exec ... +

引数はまとめてコマンドに渡される。次の例だと echo は1回だけ実行される。

find . -name '*.txt' -exec echo {} +
./c.txt ./b.txt ./a.txt

2-1. xargs

引数はまとめてコマンドに渡される。次の例だと echo は1回だけ実行される。

find . -name '*.txt' | xargs echo
./c.txt ./b.txt ./a.txt

2-2. xargs -n 1

引数は1つずつコマンドに渡される。次の例だと echo が3回実行される。

find . -name '*.txt' | xargs -n 1 echo
./c.txt
./b.txt
./a.txt

-n に指定する数によっていくつずつ渡すかコントロールできる。次の例は2つずつ。

find . -name '*.txt' | xargs -n 2 echo
./c.txt ./b.txt
./a.txt

ローカル(MacOS)の man を読んだら -nデフォルト値は 5000

xargs -n は便利だね。