zsh / bash上不区分大小写的Glob

时间:2008-10-01 09:56:40

标签: linux bash zsh glob

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

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

5 个答案:

答案 0 :(得分:31)

击:

shopt -s nocaseglob

答案 1 :(得分:27)

ZSH:

$ unsetopt CASE_GLOB

或者,如果您不想一般性地启用不区分大小写的通配符,则可以仅为不同的部分激活它:

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

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

<强>更新 几乎忘了,你必须启用extendend globbing才能工作:

setopt extendedglob

答案 2 :(得分:13)

根据您希望获得此商家信息的深度,find提供了相当多的内容 在这方面:

find . -iname 'SomeLongString*' -maxdepth 1

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

答案 3 :(得分:3)


$ 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~

答案 4 :(得分:0)

出于完整性考虑(尽管所有其他答案都更好和/或“更正确”,但为了完整起见,这还是没有提及),显然也可以使用(特别是grep爱好者):

$ ls | egrep -i '^SomeLongString'

也可能会使用冗余的ls -1(即选项“一个”,而不是“ ell”),但是当传递到管道时,无论如何,每个条目已经是每行一个。我通常会在Shell脚本中使用类似(vs 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 {} \; ...,但我确实题外话(同样,为了完整性。)