44

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

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

4

5 回答 5

37

郑州:

$ unsetopt CASE_GLOB

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

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

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

更新 差点忘了,您必须启用扩展通配才能使其工作:

setopt extendedglob
于 2008-10-01T12:50:20.507 回答
35

重击:

shopt -s nocaseglob
于 2008-10-01T10:11:26.537 回答
16

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

find . -iname 'SomeLongString*' -maxdepth 1

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

于 2008-10-01T10:10:38.207 回答
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~
于 2011-10-01T04:11:23.097 回答
1

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

$ ls | egrep -i '^SomeLongString'

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

于 2019-11-05T04:38:47.180 回答