【问题标题】:Case-insensitive Glob on zsh/bashzsh/bash 上不区分大小写的 Glob
【发布时间】:2008-10-01 09:56:39
【问题描述】:

我需要列出名称以“SomeLongString”开头的所有文件。但是“SomeLongString”的情况可能会有所不同。怎么样?

我正在使用 zsh,但也欢迎使用 bash 解决方案。

【问题讨论】:

    标签: linux bash zsh glob


    【解决方案1】:

    ZSH:

    $ unsetopt CASE_GLOB
    

    或者,如果您通常不想启用不区分大小写的通配符,您可以只为不同的部分激活它:

    $ print -l (#i)(somelongstring)*
    

    这将匹配任何以“somelongstring”开头的文件(小写/大写的任意组合)。不区分大小写标志适用于括号之间的所有内容,并且可以多次使用。阅读手册zshexpn(1) 了解更多信息。

    更新 差点忘记了,你必须启用extendend globbing才能让它工作:

    setopt extendedglob
    

    【讨论】:

    • setopt no_CASE_GLOB 呢?
    • 不管怎样,如果您设置了nocaseglob,那么您可以使用(#I) 暂时撤消它,以便区分大小写。
    【解决方案2】:

    重击:

    shopt -s nocaseglob
    

    【讨论】:

    • 谢谢。我希望有一种方法可以将其指定为 glob 本身的一部分。 zsh 手册中提到了类似的内容,但我无法弄清楚。
    【解决方案3】:

    根据您希望此列表的深度,find 提供了很多 在这方面:

    find . -iname 'SomeLongString*' -maxdepth 1
    

    这只会为您提供当前目录中的文件。这里重要的是 -iname 参数而不是 -name

    【讨论】:

      【解决方案4】:
      
      $ function i () {
      > shopt -s nocaseglob; $*; shopt -u nocaseglob
      > }
      $ ls *jtweet*
      ls: cannot access *jtweet*: No such file or directory
      $ i ls *jtweet*
      JTweet.pm  JTweet.pm~  JTweet2.pm  JTweet2.pm~
      

      【讨论】:

      • 您需要引用 glob 以将其安全地传递给函数。如果*jtweet* 匹配任何内容,它将在函数看到之前展开。 (或错误或空字符串取决于其他shopt 设置)。不过,有趣的想法。我认为如果你运行i ls '*jtweet*',它会很有效,即使目录中还有一个`jtweet.pm。不过,在非 glob args 或 glob 中,空格或其他特殊字符存在很多潜在问题。
      【解决方案5】:

      为了完整性(坦率地说,它还没有被提及,尽管所有其他答案都更好和/或“更正确”),显然也可以使用(特别是对于grep 爱好者):

      $ ls | egrep -i '^SomeLongString'
      

      也可能会插入一个多余的ls -1(这是选项“one”,而不是“ell”),但是当传递给管道时,无论如何,每个条目都将是每行一个。我通常会在 shell 脚本中使用这样的东西(与 set 相比),例如在 for/while 循环中:for i in $(ls | grep -i ...)。但是,在这种情况下,使用find 的另一个答案会更可取且更灵活,因为您可以,例如,省略目录(或设置其他限制):for i in $(find . -type f -iname 'SomeString*' -print -maxdepth 1)... 甚至完全放弃循环而只使用find 本身,例如:find ... -exec do_stuff {} \; ...,但我确实离题了(再次,为了完整性。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 2014-08-15
        • 2013-03-11
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        相关资源
        最近更新 更多