【问题标题】:Find files that does not contain a string查找不包含字符串的文件
【发布时间】:2013-02-11 10:00:55
【问题描述】:

要查找当前文件夹中包含“foo”的所有文件,我使用:

grep -r "foo" .

要查找当前文件夹中包含“bar”的所有文件,我使用:

grep -r "bar" .

但是如何找到所有不包含'foo'和'bar'的文件呢?

【问题讨论】:

    标签: regex linux grep


    【解决方案1】:

    要打印不包含某些字符串的 ,请使用 -v 标志:

    grep -r -v "bar" . | grep -v "foo"
    

    这将为您提供所有包含foobar的行。

    要打印不包含某些字符串的文件,请使用-L 标志。要不匹配多个字符串,您可以使用带有 -P 标志的正则表达式(您可以使用几个正则表达式标志):

    grep -r -L -P "(foo|bar)" .
    

    这将打印不包含foobar 的文件列表。

    感谢Anton Kovalenko 指出这一点。

    【讨论】:

    • 错了。 -v 是关于存在不匹配的行,而不是关于缺少匹配的行
    • @AntonKovalenko 你说得对,我删除了管道中的-r。对于“不匹配的行”,这就是 OP 所要求的:grep -v "foo" goves 与foo 不匹配的行。
    • 他询问不包含 foo 和 bar 的文件,而不是包含一些非 bar 行的文件和一些非 foo 行.
    • @AntonKovalenko 哦,当然了,我刚刚得到了微妙之处,我读得太快了。
    • @AntonKovalenko 已更正。感谢您的评论。
    【解决方案2】:

    递归搜索目录中所有不包含 XYZ 的文件

    find . -type f | xargs grep -L "XYZ"
    

    【讨论】:

      【解决方案3】:

      试试这个:

        grep  -L -e  "foo\|bar" *
      

      【讨论】:

        【解决方案4】:

        试试下面的。这应该工作

        grep -rL -P "(foo|bar)" .

        【讨论】:

          【解决方案5】:

          使用 awk,类似于:

          awk 'BEGIN {f=ARGV[1] ; ff=0} f != FILENAME { if ( ff>0 ) { print f } ; ff=0 ; f=FILENAME } /SEARCHSTRING/ {ff=1} END {if ( ff>0 ) { print f } }' INPUT_FILE_LIST(PATTERN)
          

          基本上它会读取每个输入文件,如果看到您的SEARCHSTRING(可以是正则表达式),它会保存该信息。在完成当前文件后(或在最后一个文件之后),检查是否找到了某些内容,如果找到,则打印之前的文件名。

          【讨论】:

            猜你喜欢
            • 2016-05-06
            • 1970-01-01
            • 2017-02-12
            • 2021-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-25
            • 2023-04-10
            相关资源
            最近更新 更多