一个简单的问题.一个命令
cat * | wc -c
Run Code Online (Sandbox Code Playgroud)
不需要xargs,但命令
ls | xargs echo
Run Code Online (Sandbox Code Playgroud)
需要xargs命令.可以请有人更清楚地向我解释xargs的概念.谢谢.
简而言之,xargs将stdin(标准输入)转换为您指定的命令的参数.例如
$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3
Run Code Online (Sandbox Code Playgroud)
seq,如您所见,打印序列stdout.我们|将输出管道()传递给xargson stdin.用参数xargs调用,所以我们得到.echostdinecho 1 2 3
正如el.pescado所说,wc接受输入stdin(你也可以给它一个文件参数).因为cat打印文件stdout,你可以直接管它wc.
$ cat text
This is only
a test
$ cat text | wc
2 5 20
$ wc text
2 5 20 text
Run Code Online (Sandbox Code Playgroud)
echo不接受任何东西stdin.这很奇怪,因为echo打印的工作是stdout- 你可以打印任何你管道的东西.因此,您使用xargs将流转换为参数.
echo看看发生了什么可能是太微不足道了,所以这里有一个更现实的例子.假设我们有一个包含一些文件的目录:
$ ls
bar1 foo1 foo2 foo3 foo4 foo5 foo6
Run Code Online (Sandbox Code Playgroud)
我们已经有了它foo,我们希望删除所有这些,但我们不能打扰键入rm foo1 foo2 ....毕竟,我们是程序员,我们很懒.我们能做的是......
$ ls foo* | xargs rm
$ ls
bar1
Run Code Online (Sandbox Code Playgroud)
rm期望参数,ls foo*打印我们想要删除的每个文件,并xargs进行翻译.
作为旁注,有时你想要stdin分成更小的部分.xargs -n对此非常有用,并且一次将N个参数传递给最终命令.
$ ls foo* | xargs -n2 echo
foo1 foo2
foo3 foo4
foo5 foo6
Run Code Online (Sandbox Code Playgroud)