私は読んだここin の終わりまでパイピングしてcommand
in 呼び出しの数を計算できます。-exec command {} +
| wc -l
-execdir
これが異なることはわかっていますが、見つかった各一致するサブディレクトリごとに含まれているfind
サブディレクトリで呼び出しを実行するため、サブcommand
ディレクトリに一致する複数のファイルがある場合は最終的にそうする必要があります。通話数は通話数と同じです。一致するサブディレクトリといいえこのサブディレクトリの一致するファイルの数と一致する呼び出しの数は何ですか?
次のコマンドを実行すると、後者で終わります。
$ find . -name "bob*" -execdir echo {} + | wc -l
マニュアルページにはexecdir command {} +
前者が該当しなければならないと明示されています。
-exec
アクションと同様に、フォームは複数の一致するファイルを処理するためのコマンドラインを作成しますが、指定された呼び出しは+
同じサブディレクトリに存在するファイルのみを一覧表示します。-execdir
command
つまり
私は得る:
./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3
マンページによると、これを予想すると次のようになります。
./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
答え1
これはパフォーマンスの問題ですfind
。findutils
バージョン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