【问题标题】:regex - find files that don't match正则表达式 - 查找不匹配的文件
【发布时间】:2013-02-21 14:51:28
【问题描述】:

我有一个目录列表,其中大多数目录的格式为./[foobar]/。但是,有些格式类似于./[foo] bar/

我想使用find(或我的 shell 提供的一些其他实用程序)来查找那些 匹配第一个模式的目录(即在方括号之外有文本)。直到现在,我都无法找到一种方法来“反转”我的模式。

有什么办法吗?

【问题讨论】:

  • 澄清一下-您正在寻找一个正则表达式,该正则表达式匹配具有// 字符之间的文本而不是[] 字符之间的文本?这是否意味着任何与/[.*]/ 不匹配的字符串 - 当然,适当地转义了/[] 字符......?至于“匹配不匹配的东西”……见stackoverflow.com/questions/406230/…

标签: regex bash find


【解决方案1】:
find -type d -name '*\]?*'

除非你坚持打开括号检查...

【讨论】:

    【解决方案2】:

    您可以将 find 与 grep 及其 -v 选项结合使用。 find . -type d | grep -v "[foobar]"

    【讨论】:

    • 可能是最简单的解决方案。
    • 这是不正确的。您需要切换到grep -Fv 以切换到文字匹配,或转义正则表达式特殊\[,因为当前正则表达式将匹配包含foba 或的任何字符串r 任何地方。
    • 这并不理想,因为不会阻止find“查找”不匹配的文件。当您处理要排除的数千个文件和目录时,这是一个重大挫折。
    【解决方案3】:

    一个简单的常规 glob 将适用于这个特定的示例:

    $ ls
    [a]b [ab]
    $ echo \[*\]
    [ab]
    

    对于更复杂的模式,您可以启用extglob

    !(pattern-list)
         Matches anything except one of the given patterns
    

    (and similar globs)

    或者使用查找:

    find dir ! -name ...
    

    【讨论】:

    • 一般来说可以,但将find 传递到grep 似乎更容易。
    • 只要你不打算使用它而不是简单地看,那很好,尽管我认为 glob 更容易(如果文件名中有空格,则更安全)。跨度>
    【解决方案4】:

    find 支持通过!-not 求反。后者不符合 POSIX。要使用!,您必须在其前面加上反斜杠或将其放在单引号内。

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多