xargs -I 选项

sjs*_*sam 15 xargs

xargs的手册说:

-I replace-str
--replace[=replace-str]
-i[replace-str]
用从标准输入读取的名称替换初始参数中出现的 replace-str。

我不明白这部分: with names read from standard input.

例如发生了什么:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l
Run Code Online (Sandbox Code Playgroud)

上面的代码计算目录中的文件/目录总数。

有人可以为我解释一下吗?

Ste*_*itt 27

“使用从标准输入读取的名称”意味着xargs接收进入其标准输入的数据,将其拆分,并使用它来运行其参数中给出的命令。默认情况下,它在空格或换行符处拆分,并一次运行echo尽可能多的参数。

-0您示例中的选项指示xargs将其输入拆分为空字节而不是空格或换行符。结合find's -print0,这允许正确处理包含空格或换行符的文件名。

-I选项更改了构建新命令行的方式。不是一次添加尽可能多的参数,而是xargs从输入中一次取一个名称,查找给定的标记({}此处)并将其替换为名称。

在您的示例中,{}不存在于给定的命令模板中xargs,因此实际上xargs被指示echo不带参数运行,对于find. 要看到这一点,请删除wc

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo
Run Code Online (Sandbox Code Playgroud)

你会看到一系列空行......比较这个

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}
Run Code Online (Sandbox Code Playgroud)

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo
Run Code Online (Sandbox Code Playgroud)

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0
Run Code Online (Sandbox Code Playgroud)

以获得更好的理解。