Linux xargs命令

H D*_*H D 2 linux xargs

一个简单的问题.一个命令

cat * | wc -c
Run Code Online (Sandbox Code Playgroud)

不需要xargs,但命令

ls | xargs echo
Run Code Online (Sandbox Code Playgroud)

需要xargs命令.可以请有人更清楚地向我解释xargs的概念.谢谢.

Kri*_*ján 7

简而言之,xargsstdin(标准输入)转换为您指定的命令的参数.例如

$ 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)