【发布时间】:2008-10-01 09:56:39
【问题描述】:
我需要列出名称以“SomeLongString”开头的所有文件。但是“SomeLongString”的情况可能会有所不同。怎么样?
我正在使用 zsh,但也欢迎使用 bash 解决方案。
【问题讨论】:
我需要列出名称以“SomeLongString”开头的所有文件。但是“SomeLongString”的情况可能会有所不同。怎么样?
我正在使用 zsh,但也欢迎使用 bash 解决方案。
【问题讨论】:
ZSH:
$ unsetopt CASE_GLOB
或者,如果您通常不想启用不区分大小写的通配符,您可以只为不同的部分激活它:
$ print -l (#i)(somelongstring)*
这将匹配任何以“somelongstring”开头的文件(小写/大写的任意组合)。不区分大小写标志适用于括号之间的所有内容,并且可以多次使用。阅读手册zshexpn(1) 了解更多信息。
更新 差点忘记了,你必须启用extendend globbing才能让它工作:
setopt extendedglob
【讨论】:
setopt no_CASE_GLOB 呢?
nocaseglob,那么您可以使用(#I) 暂时撤消它,以便区分大小写。
重击:
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~
【讨论】:
*jtweet* 匹配任何内容,它将在函数看到之前展开。 (或错误或空字符串取决于其他shopt 设置)。不过,有趣的想法。我认为如果你运行i ls '*jtweet*',它会很有效,即使目录中还有一个`jtweet.pm。不过,在非 glob args 或 glob 中,空格或其他特殊字符存在很多潜在问题。
为了完整性(坦率地说,它还没有被提及,尽管所有其他答案都更好和/或“更正确”),显然也可以使用(特别是对于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 {} \; ...,但我确实离题了(再次,为了完整性。)
【讨论】: