このfind -execdir {} +(プラス)を使用すると、なぜ3回ではなく4回の呼び出しで終了するのですか?


8

ここで、末尾までパイプすることでcommandin の呼び出し回数を数えることができることを読みました。-exec command {} +| wc -l

私はそれ-execdirが異なっていることを理解していますが、その中で、一致するすべてのサブディレクトリがfind検出さcommandれると、サブディレクトリに一致するファイルが複数ある場合、それが含まれているサブディレクトリからの呼び出しが実行されます。呼び出しの数が、一致するサブディレクトリの数と等しくなり、それらのサブディレクトリ内の一致するファイルの数と一致する呼び出しの数ではないのですか?

次を実行すると、最終的に後者になります。

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

execdir command {} +前者がそうであるべきであると州のマニュアルページ:

同じように-exec行動、+の形は-execdirより1つのマッチファイルよりもプロセスへのコマンドラインが、任意の特定の呼び出し構築するcommand同じサブディレクトリに存在する唯一のリストファイル意志を。


すなわち

私は得ています:

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

私がこれを期待しているとき、manページに基づいて:

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

一般的に、コマンドの呼び出しをそのようにカウントすることはできません。コマンドがechoあり、引数がによって生成さ{} +れ、ファイル名に改行がない場合(ほとんどの人はそうではありません)、行数は呼び出しの数であり、機能します。コマンドが言われると、head -n 999000 /dev/urandomそれはひどく間違っています。
dave_thompson_085

回答:


11

これはのパフォーマンスの問題ですfind。ではfindutils、バージョン4.3.4、この問題を回避するには、引数の数を制限しなければならなかった-execdir ... {} +制限が削除されたバージョン4.5.9に1を使用しますが。

例を見る:

$ 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つの引数が必要です。

find4.4.2:

$ 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

find4.6.0:

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.