我在 bash 的文件模式中遇到了以下恕我直言的奇怪行为:
$ ls
Basic1 datei1 datie2 sdfl
$ ls [a-z]*
Basic1 datei1 datie2 sdfl
$ ls [abcdefghijklmnopqrstuvwxyz]*
datei1 datie2 sdfl
为什么范围为 [a-z]
的模式不区分大小写?错误或功能?
注意:
bash-Option
nocaseglob
是off
(否则,上面给出的第二个模式也应该不区分大小写...):$ shopt nocaseglob nocaseglob off
我的 bash 版本:
$ bash --version GNU bash, Version 4.2.24(1)-release (i686-pc-linux-gnu)
GNU bash,版本 4.2.24(1)-release (i686-pc-linux-gnu)
最佳答案
如果您只想要以小写字母开头的文件名,请使用
ls [[:lower:]]*
编辑
回答 F. Hauri 的评论:section 3.5.8.1 of the reference manual说明了一切。但在我们阅读它之前,让我们玩一下 (YMMV):创建一个新的暂存目录并
$ # Create lots of cool files
$ touch {a..z} {A..Z}
$ ls
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
$ ls [a-b]
a A b
$ # Do you get it?
$ ls [a-B]
a A b B
所以它似乎 bash 的字母顺序(这里,在我的机器上,根据我的设置)是:
aAbBcCdDeE...
这也许可以解释为什么您会得到结果(看起来您的设置与我的相似)。
现在,去阅读 section 3.5.8.1 of the reference manual你会明白事情并不那么简单,排序取决于环境变量 LC_COLLATE
的值。
所以尝试:
$ LC_COLLATE=C
$ ls [a-b]
a b
是啊!
道德
如果您需要小写字母,请不要使用 [a-z]
,因为这在很大程度上取决于本地设置。相反,请使用 [[:lower:]]
。在引用手册中,您还会找到其他几个有用的字符类。
底线
那么,错误或功能?您现在有了答案 ;-)
希望这对您有所帮助!
关于bash - bash 文件模式和区分大小写的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13929984/