我需要列出所有名称以'SomeLongString'开头的文件。但是'SomeLongString'的情况可能有所不同。怎么样?
我正在使用zsh,但也欢迎使用bash解决方案。
ZSH:
$ unsetopt CASE_GLOB
或者,如果您一般不希望启用不区分大小写的glob,则可以仅针对不同部分激活它:
$ print -l (#i)(somelongstring)*
这将匹配以“ somelongstring”开头的任何文件(大小写任意组合)。不区分大小写的标志适用于括号之间的所有内容,并且可以多次使用。阅读手册zshexpn(1)
了解更多信息。
UPDATE差点忘了,您必须启用扩展全局性才能起作用:
setopt extendedglob
bash:
shopt -s nocaseglob
取决于您希望获得此列表的深度,find
提供了很多在这方面:
find . -iname 'SomeLongString*' -maxdepth 1
这只会给您当前目录中的文件。重要的是-iname
参数代替-name
。
$ 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~
为了完整性(尽管所有其他答案都更好和/或“更正确”,为了完整性(坦率地讲,它没有被提及,显然,也可以使用(特别是对于grep
爱好者):]])>
$ ls | egrep -i '^SomeLongString'
[一个人也可能会留在冗余的
ls -1
中(即选项“一个”,而不是“ ell”),但是当传递到管道时,无论如何,每个条目已经是每行一个。我通常会在Shell脚本中使用类似(vsset
)的东西,例如在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 {} \; ...
,但我确实题外话(同样,为了完整性。)