Linux xargs 命令

Linux xargs command

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

cat * | wc -c

不需要 xargs,但是命令

ls | xargs echo

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

wc 从其 标准输入 读取数据,而 echo 打印其 命令行参数 .

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

$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3

seq,如您所见,将序列打印到 stdout。我们将 (|) 输出到 stdin 上的 xargsxargsstdin 作为参数调用 echo,所以我们得到 echo 1 2 3.

一样,wc 接受 stdin 上的输入(您也可以给它一个文件参数)。因为 cat 将文件打印到 stdout,您可以将其直接通过管道传输到 wc.

$ cat text
This is only
a test
$ cat text | wc
      2       5      20
$ wc text
 2  5 20 text

echo 不接受来自 stdin 的任何内容。那会很奇怪,因为 echo 的工作是打印到 stdout - 你已经可以打印任何你想用管道传输的东西了。因此,您使用 xargs 将流转换为参数。

echo 可能是一个微不足道的命令,无法查看发生了什么,所以这里有一个更真实的例子。假设我们有一个包含一些文件的目录:

$ ls
bar1 foo1 foo2 foo3 foo4 foo5 foo6

我们已经用 foo 搞定了,我们想删除所有这些,但我们懒得输入 rm foo1 foo2 ...。毕竟,我们是程序员,而且我们很懒惰。我们能做的是...

$ ls foo* | xargs rm
$ ls
bar1

rm 需要参数,ls foo* 打印我们要删除的每个文件,xargs 进行翻译。


附带说明一下,有时您想将 stdin 分成更小的部分。 xargs -n 对此非常有用,它一次将 N 个参数传递给您的最终命令。

$ ls foo* | xargs -n2 echo
foo1 foo2
foo3 foo4
foo5 foo6