【问题标题】:linux find files with optional character in their namelinux查找名称中带有可选字符的文件
【发布时间】:2018-12-10 16:30:31
【问题描述】:

假设我有两个文件:acabc。我想找到一个正则表达式来匹配这两个文件。通常我希望以下正则表达式可以工作,但它永远不会:

find ./ -name ab?c

我尝试过转义或不转义问号,这似乎永远不会奏效。通常在我发现的正则表达式文档中; ? 表示:前一个字符重复了 0 或 1 次,但 find 似乎不明白这一点。

我在两个不同的 find 版本上试过这个:GNU find 4.2.31 和 查找 (GNU findutils) 4.6.0

PS:这适用于*,但我特别想匹配一个可选字符

find ./ -name a*c

给予

./ac
./abc

【问题讨论】:

    标签: regex linux find


    【解决方案1】:

    要匹配只有一个可选字符的表达式,请尝试使用or 选项:

    touch abc ac abbc
    find . -name "a?c" -or -name "ac"
    

    只为您提供:abcac 名称。

    通常您可以使用orand 选项构建相当复杂的查找查询 =)

    【讨论】:

      【解决方案2】:

      find -name 选项使用 glob 模式,这与正则表达式不同。对于 glob,? 表示任何单个字符。如果你想让一个字符是可选的,你需要使用两种模式:

      find ./ -name abc -o -name ac
      

      【讨论】:

        【解决方案3】:

        传递给-name 的表达式不是正则表达式,它是一个全局表达式。 (单个)glob 表达式不能用于您的用例,但您可以通过 -regex 使用正则表达式:

        find -regex '.*/ab?c'
        

        顺便说一句,默认的正则表达式语言是 Emacs 样式,如下所述:https://www.emacswiki.org/emacs/RegularExpression。您可以使用-regextype 更改正则表达式语言。

        【讨论】:

          【解决方案4】:

          其他答案足以提供解决方案,但了解find-regex 选项匹配整个条目是必不可少的。所以你不能只做部分匹配:

          -regex 'ab?c'
          

          你必须使用一两个点星:

          -regex '.*ab?c.*'
          

          如果没有通配符,这也可以使用grep

          ls . | grep 'ab\?c' 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-17
            • 2011-10-02
            • 1970-01-01
            相关资源
            最近更新 更多