如何为 find -exec command {} + 构建命令行

如何为 find -exec command {} + 构建命令行

我发现手册的解释有点find不清楚。

“但是命令行是通过在末尾附加每个选定的文件来构建的;命令的总调用次数将远远少于匹配的文件数”是什么意思,为什么会这样?

以下是man find

-exec 命令 {} +

-exec操作变体对选定的文件运行指定的命令,但命令行是通过在末尾附加每个选定文件名来构建的;命令的总调用次数将远少于匹配的文件数。命令行的构建方式与xargs构建其命令行的方式大致相同。命令中只允许一个“{}”实例。命令在起始目录中执行。

答案1

“但是命令行是通过在末尾附加每个选定的文件来构建的;命令的总调用次数将远远少于匹配的文件数”是什么意思,为什么会这样?

让我们创建一些示例文件:

touch {1..5}.txt

首先,让我们运行一个 find 命令:

$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt

如您所见,{}替换为找到的所有文件的列表find。在此示例中,我们有六个匹配的文件,但echo仅运行一次。

请注意,shell 对单个命令行上可接受的字符数有限制。shell find知道这一点,如果一个命令行上要放入的文件太多, shell 将对不同的文件find运行echo多次,直到处理完所有文件名。这就是为什么“命令的调用次数将远少于匹配的文件数”。

让我们通过在目录中创建许多文件来测试这一点:

touch this_is_a_long_file_name{1..10000}.txt

现在,让我们执行一个 find 命令:

$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line

如您所见,尽管该目录有超过 10,000 个文件,但 exec 命令仅运行了三次。

相关内容