我发现手册的解释有点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 命令仅运行了三次。