【问题标题】:Why can't `find` actually find all of the directories matching a pattern?为什么 `find` 不能真正找到与模式匹配的所有目录?
【发布时间】:2020-01-04 16:34:18
【问题描述】:

我有匹配模式foo[0-9]+foo-bar 的目录。我想删除与前一种模式匹配的所有目录。我这样做的目标是使用find,但是当我尝试查找与前一种模式匹配的目录时,我不记得它们了:

$ mkdir foo{1..15} foo-bar
$ # yields nothing
$ find . -name "foo[0-9]+"

当我尝试查找与foo[^-] 匹配的所有内容时,只出现了一些目录:

$ find . -name "foo[^-]"
./foo9
./foo7
./foo6
./foo1
./foo8
./foo4
./foo3
./foo2
./foo5

我玩过-regex 标志和所有可用的-regextypes,但似乎无法正确使用魔法。

如何列出所有这些目录?

【问题讨论】:

    标签: regex unix find


    【解决方案1】:

    这应该可行:

    find -E . -regex '.*/foo[0-9]+'
    

    您可能想要限制类型:find -E . -type d -regex '.*/foo[0-9]+'

    【讨论】:

      【解决方案2】:

      这行得通:

      $ ls -F
      foo-bar/  foo10/  foo12/  foo14/  foo2/  foo4/  foo6/  foo8/
      foo1/     foo11/  foo13/  foo15/  foo3/  foo5/  foo7/  foo9/
      
      $ find . -name "foo[^-]*"
      ./foo1
      ./foo2
      ./foo3
      ./foo4
      ./foo5
      ./foo6
      ./foo7
      ./foo8
      ./foo9
      ./foo10
      ./foo11
      ./foo12
      ./foo13
      ./foo14
      ./foo15
      

      或者,如果您的目标是列出所有与foo-bar 不匹配的目录,那么您可以简单地使用-not 运算符:

      $ find . -not -name foo-bar
      .
      ./foo1
      ./foo2
      ./foo3
      ./foo4
      ./foo5
      ./foo6
      ./foo7
      ./foo8
      ./foo9
      ./foo10
      ./foo11
      ./foo12
      ./foo13
      ./foo14
      ./foo15
      

      【讨论】:

        【解决方案3】:

        顺便说一句,当您不使用 -regex 标志时,您使用的是文件通配符而不是正则表达式。

        使用通配符查找文件:

        find . -name "foo[1-9]" -o -name "foo1[0-5]" -o -name "foo-bar"
        

        在这里,我们匹配名称为“foo”后跟“1 到 9 之间的一位数”的任何文件,或者名称为 foo1 后跟“0 到 5 之间的一位数”的文件,或者完全命名为“foo-bar”的文件。

        或者,如果您知道该目录除了您创建的文件之外没有任何编号的文件:

        find . -name "foo[1-9]*" -o -name "foo-bar'"
        

        在这里,我们找到所有名为“foo”的文件,后跟一位数字,后跟任意数量的任意字符,或者完全命名为 foo-bar 的文件。通配符不像正则表达式那样精确,但通常足够而且速度很快。

        * 和 ?通配符与正则表达式不同。在通配符中,它们本身代表被匹配字符串中的未知字符以及它们的数量。在正则表达式中,它们修改正则表达式中的前一个原子,并表示前一个原子的数量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-21
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          相关资源
          最近更新 更多