-exec cmd {} 和 xargs -I 之间有什么区别?

-exec cmd {} 和 xargs -I 之间有什么区别?

通常,xargs将所有内容捆绑在一起,但与标志一起使用时,-I它似乎将所有内容作为一行进行评估。这是否意味着它失去了速度优势?此外,如果-exec cmd {}使用 + 语法,是否意味着它的性能会比 更好xargs -I

答案1

简短的回答是“是”。

xargs -I{} cmd允许多次出现指定的替换字符串,但每次执行时只会提供一个输入项cmd,这意味着在下面的例子中,echo将被调用三次:

$ mkdir t
$ cd t
$ touch foo bar baz

$ find . -type f | xargs -I{} echo {} {}
./bar ./bar
./baz ./baz
./foo ./foo

请注意,如果您不需要在每个命令行中多次指定每个输入项,那么find -exec cmd {} +大致相当于find | xargs(没有-I),只是它默认处理带有空格的文件名(要使用后者正确处理嵌入的空格,请使用find -print0 | xargs -0)。

find -exec cmd {} +将向 传递多个输入项,但只允许cmd出现一次替换字符串 ( )。这也是不带的默认行为。在下面的示例中,对于每组参数, 仅调用一次(对于大型输入集,这两种方法都会将输入拆分为块,以便每个生成的命令行都比 短,这意味着可以多次调用,但每个输入项的调用次数远少于一次):{}xargs-IechoPATH_MAXcmd

$ find . -type f -exec echo {} +
./bar ./baz ./foo

$ find . -type f | xargs echo
./bar ./baz ./foo

相关内容