使用 find -execdir {} + (plus) 时,为什么我最终得到 4 次调用而不是 3 次?

使用 find -execdir {} + (plus) 时,为什么我最终得到 4 次调用而不是 3 次?

我读这里您可以通过管道到 in 的末尾来计算commandin的调用次数。-exec command {} +| wc -l

虽然我知道这-execdir是不同的,因为对于发现的每个匹配的子目录find,它都会从它所包含的子目录中运行调用command,如果我有多个在子目录中匹配的文件,应该我最终得到的调用次数等于匹配子目录的数量,并且不是与这些子目录中匹配文件的数量相匹配的调用次数?

当我运行以下命令时,我最终得到了后者:

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

手册页指出execdir command {} +前者应该是这种情况:

-exec操作一样,+的形式-execdir将构建一个命令行来处理多个匹配的文件,但任何给定的 调用command都只会列出同一子目录中存在的文件。


IE

我越来越:

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

当我期待这个时,根据手册页:

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

答案1

这是一个性能问题find。在findutils4.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 次。第二次调用应该有 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

相关内容