为什么在使用此find -execdir {} +(加号)时最终得到4次调用而不是3次调用?


8

在这里读到,您可以通过管道传输到commandin 末尾来计数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

您通常无法以这种方式计算命令调用。如果命令是echo且参数由生成,{} +并且文件名中没有换行符(大多数人没有),那么行数就是调用的数目,它可以工作。如果说命令,head -n 999000 /dev/urandom那将是非常错误的。
dave_thompson_085 '16

Answers:


11

这是的性能问题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次。第二次调用应具有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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.