通常,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
-I
echo
PATH_MAX
cmd
$ find . -type f -exec echo {} +
./bar ./baz ./foo
$ find . -type f | xargs echo
./bar ./baz ./foo