执行命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt
时,返回以下结果。
./testfile.txt
./testread.txt
相比之下,命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0
输出./testfile.txt./testread.txt
为单行,据我了解,该标志将其-print0
剥离/替换\n
为NUL
或\0
将其用作分隔符。
当后面的命令和参数传递给xargs
如下find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 -i echo {}
时,它显示
./testfile.txt
./testread.txt
我假设不需要'{}'
后续,因为使用了标志并且处理了空格等字符而没有错误。echo
-print0
下面的命令都生成一行。
find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0
find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 echo
为什么xargs
with{}
返回带有换行符的结果?
如果{}
附加一个换行符,为什么要将它与命令结合使用,例如echo {}
?
对于 GNU
xargs
,该-i
选项(已弃用并且)与-I {}
. 这意味着“用标准输入中的一项替换实用程序中出现的字符串{}
,然后运行实用程序并使用标准输入中的下一项重复”。您的实用程序调用是
echo {}
,并且您将两件事传递给xargs
. 这意味着调用echo
两次,每次使用从标准输入读取的项目之一。每次调用都会echo
输出一个尾随换行符(这是 的一个功能echo
)。如果没有
echo {}
and-i
,xargs
将从标准输入中收集尽可能多的项目并输出它们,就好像它一次调用echo
所有这些项目一样。简而言之,
xargs
不添加换行符,echo
确实如此。它这样做是因为您多次调用它。示例(
-t
添加以便xargs
显示它的作用):换行符是由添加的
echo
,而不是添加的xargs
。使用时的不同之
-i
处在于此选项强制-L 1
(一行或每个命令一个空分隔字段)。因此echo
,每个输入字段运行一次,因此字段之间有一个换行符(echo
通常在完成时添加一个换行符)。没有
-i
,因此没有-L 1
,每个回声接收更多字段,因此大多数字段用空格分隔(回声连接其参数,由空格分隔)。