【问题标题】:subtle difference in using xargs and xargs -i使用 xargs 和 xargs -i 的细微差别
【发布时间】:2011-07-08 17:34:44
【问题描述】:

为什么find . -name "*.xml" | xargs grep FOO 返回匹配文件名,而find . -name "*.xml" | xargs -i -sh -c "grep FOO {}" 不返回?

【问题讨论】:

    标签: bash grep xargs


    【解决方案1】:

    除非在发布您的问题时出现拼写错误,否则sh 之前不应有连字符:

    您没有在输出中获得文件名的原因是 grep 正在使用单个文件作为参数运行。要强制文件名输出,请使用-H

    find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"
    

    此外,xargs-i 在版本 4.2.9 左右已被弃用。你应该使用-I {}

    【讨论】:

      【解决方案2】:

      你可以使用

      find . -name "*.xml" | xargs -I{} grep FOO {}
      

      您可以根据需要在grep 命令中使用-H-n

      【讨论】:

      • 没有提供上述问题的答案。
      【解决方案3】:

      正如前面的回答所说,不同之处在于 grep 正在为每个文件调用,如果在命令行上仅指定一个文件,则 grep 不会报告文件名,除非 -H (--with-filename) 标志已给出。

      为什么要为每个文件调用 grep?这是因为(喜欢与否)对 xargs 使用 -I(或 -i)标志会强制命令为每个参数运行一次,例如使用标志“-L 1”来xargs。

      来自手册页:

         -I replace-str
           Replace occurrences of replace-str in the initial-arguments with names read from
           standard input.  Also, unquoted blanks do not terminate input items; instead the
           separator is the newline character.  Implies -x and -L 1.
      

      【讨论】:

        猜你喜欢
        • 2018-06-02
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多