【问题标题】:Linux xargs commandLinux xargs 命令
【发布时间】:2015-10-06 22:46:47
【问题描述】:

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

cat * | wc -c

不需要 xargs,但需要命令

ls | xargs echo

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

【问题讨论】:

    标签: linux xargs


    【解决方案1】:

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

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

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

    作为el.pescado saidwc 接受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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-26
        • 2020-05-14
        • 2011-08-11
        • 2011-07-07
        • 2016-07-13
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多