一个简短的问题。 一个命令
cat * | wc -c
不需要xargs,但是命令
ls | xargs echo
需要 xargs 命令。 可以请有人更清楚地向我解释 xargs 的概念。 谢谢。
最佳答案
简而言之,xargs
将stdin
(标准输入)转换为您指定命令的参数。例如
$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3
seq
,如您所见,将序列打印到 stdout
。我们将 (|
) 输出到 stdin
上的 xargs
。 xargs
以 stdin
作为参数调用 echo
,因此我们得到 echo 1 2 3
。
作为el.pescado said , 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
关于Linux xargs 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32972377/