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

lee*_*d00 8 find

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

虽然我理解这-execdir是不同的,但对于find发现的每个匹配子目录,它都会command从它所包含的子目录中调用,如果我有多个文件在子目录中匹配,应该我最终得到的调用数是否等于匹配子目录的数量,而不是与这些子目录中匹配文件数匹配的调用数?

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

$ find . -name "bob*" -execdir echo {} + | wc -l
Run Code Online (Sandbox Code Playgroud)

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

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


IE

我越来越:

./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3
Run Code Online (Sandbox Code Playgroud)

当我期待这个时,基于手册页:

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 11

这是 的性能问题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
Run Code Online (Sandbox Code Playgroud)

使用-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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)