【问题标题】:xargs grep ignore files that dont meet queryxargs grep 忽略不符合查询的文件
【发布时间】:2011-08-07 16:43:58
【问题描述】:

关于使用 xargs 执行 grep 的快速问题。当我这样做时,我会看到一堆不存在的文件的结果,其中穿插着成功匹配搜索条件的文件,例如:

find . | xargs grep 'Cache'

grep: PT: No such file or directory
grep: Sans: No such file or directory
grep: Free: No such file or directory
grep: Font: No such file or directory
grep: License.txt: No such file or directory

是否有可以传递的 arg 只显示命中?

谢谢。

【问题讨论】:

    标签: bash unix grep xargs


    【解决方案1】:

    文件名包含空格,因此您需要告诉find 输出由 NUL 字节而不是换行符分隔的结果 - 请尝试以下操作:

    find . -print0 | xargs -0 egrep 'Cache'
    

    -0xargs 表示将来自 STDIN 的数据解释为 由 NUL 字节分隔。 (这里不需要Cache 周围的单引号。)

    类 Unix 系统上的许多工具同样可以选择生产或使用 由 NUL 字节分隔的数据,因为 0x000x2F(正斜杠) 是文件或目录中唯一不允许的两个字节 名称 - 这是安全处理带空格的文件名的常用方法 或换行符。

    最后一点,要非常挑剔,您可能需要将其更改为:

    xargs -0 egrep Cache /dev/null
    

    ...这样您就可以确定grep 始终有多个参数,并且您会得到始终以文件名为前缀的输出。

    【讨论】:

      【解决方案2】:

      如果你有 GNU grep,就让它递归

      grep -R "Cache" *
      

      【讨论】:

        【解决方案3】:
        find . | xargs grep 'Cache' 2>/dev/null
        

        【讨论】:

          【解决方案4】:

          将 find 与 xargs 一起使用时,您应该始终使用 -print0,因为 http://en.wikipedia.org/wiki/Xargs#The_separator_problem 的分隔符问题。但是,如果您有一个文件列表,每个文件都在一行上,您可能需要查看 GNU Parallel:

          find . | parallel grep Cache
          

          观看介绍视频了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多