这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
上面的代码计算目录内的文件/目录总数。
有人能为我解释一下吗?
答案1
“使用从标准输入读取的名称”意味着xargs
获取标准输入中传入的数据,将其拆分,并使用它来运行其参数中给出的命令。默认情况下,它按空格或换行符进行分割,并echo
一次使用尽可能多的参数运行。
-0
示例中的选项指示将xargs
其输入拆分为空字节而不是空格或换行符。与find
s结合使用-print0
,可以正确处理包含空格或换行符的文件名。
该-I
选项改变了新命令行的构建方式。不是一次添加尽可能多的参数,而是xargs
一次从输入中获取一个名称,查找给定的标记({}
此处)并将其替换为名称。
在您的示例中,{}
不存在于 给定的命令模板中xargs
,因此实际上xargs
指示echo
不带参数运行,对于 给定的每个文件名运行一次find
。要查看此内容,请删除wc
:
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo
你会看到一系列空行...将其与
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}
和
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo
和
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0
以获得更好的理解。