find -execdir {} +(plus)を使用すると、なぜ3回ではなく4回の呼び出しが発生するのですか?

find -execdir {} +(plus)を使用すると、なぜ3回ではなく4回の呼び出しが発生するのですか?

私は読んだここin の終わりまでパイピングしてcommandin 呼び出しの数を計算できます。-exec command {} +| wc -l

-execdirこれが異なることはわかっていますが、見つかった各一致するサブディレクトリごとに含まれているfindサブディレクトリで呼び出しを実行するため、サブcommandディレクトリに一致する複数のファイルがある場合は最終的にそうする必要があります。通話数は通話数と同じです。一致するサブディレクトリといいえこのサブディレクトリの一致するファイルの数と一致する呼び出しの数は何ですか?

次のコマンドを実行すると、後者で終わります。

$ find . -name "bob*" -execdir echo {} + | wc -l

マニュアルページにはexecdir command {} +前者が該当しなければならないと明示されています。

-execアクションと同様に、フォームは複数の一致するファイルを処理するためのコマンドラインを作成しますが、指定された呼び出しは+同じサブディレクトリに存在するファイルのみを一覧表示します。-execdircommand


つまり

私は得る:

./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3

マンページによると、これを予想すると次のようになります。

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3

答え1

これはパフォーマンスの問題ですfindfindutilsバージョン4.3.4では解決策使用されるパラメータの数は-execdir ... {} +1つに制限する必要があります。バージョン4.5.9では、この制限は削除されました。

例を見てください。

$ mkdir -p dir{1..3}
$ touch dir{1..3}/file1 dir2/file{1..3}
$ find
.
./dir1
./dir1/file1
./dir2
./dir2/file1
./dir2/file2
./dir2/file3
./dir3
./dir3/file1

使用時には、-execdir {} +このコマンドを3回実行する必要があります。 2番目の呼び出しには3つのパラメータが必要です。

4.4.2の場合find

$ find-4.4.2 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 in /path/to/dir2
Executing ./file2 in /path/to/dir2
Executing ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3

4.6.0の場合find

$ find-4.6.0 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 ./file2 ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3

関連情報