2017-04-07 96 views
4

我正在寻找以大写字母开头的Linux目录中的文件列表。在Unix系统,这是一个简单的Linux与Unix文件通配符

LS [AZ] *

在Linux中,不过,我看到的比赛,似乎没有要区分大小写:

=> ls 
A.txt  b.txt  B.txt  c.txt  C.txt 

=> ls [A]* 
A.txt 

=> ls [AB]* 
A.txt  B.txt 

=> ls [ABC]* 
A.txt  B.txt  C.txt 


= > LS [AC] * A.TXT b.txt b.txt c.txt c.txt

=> ls [b]* 
b.txt 


=> ls [a-c] * A.txt b.txt B.txt c.txt

在Unix端运行相同的命令就像我期望的那样工作。这是Linux一直表现的方式吗?用awk解决这个问题很容易,所以我没有以这种方式寻找解决方案,但我想知道如果我以前从未注意到这一点。提前致谢。

+0

在您的输出中看不到任何特别的东西......请说明(至少命令和输出似乎在某些时候是混合的)。另外请注意,这不是OS(Linux vs Unix vs ...)的问题,而是shell变体和配置的问题。 –

+0

对,我期待[A-C}不包括b或c,但是根据这些答案,这是环境变量的影响(正如你指出的那样,而不是Linux和Unix)。 –

回答

7

结果取决于不同的外壳的选择,特别是:nocasematch nocaseglob 并且还LC_COLLATE变量(在排序中使用,[ - ],等)

$ shopt extglob nocasematch nocaseglob 
extglob   off 
nocasematch  off 
nocaseglob  off 


$ printf "%s\n" a A b B c C | sort 
a 
A 
b 
B 
c 
C 

所以[AC]范围含有B和C,但不是a,[ac]应该包含A而不是C.

$ printf "%s\n" a A b B c C | LC_COLLATE=C sort 
A 
B 
C 
a 
b 
c 

给出了不同的结果。

$ LC_COLLATE=C ls [A-C]* 

应该返回预期的结果,这句法设置变量仅用于新的流程执行(LS),但不是在当前shell进程。

编辑:感谢评论,以前的命令是错误的,因为扩展是在LC_COLLATE被设置之前处理的,最简单的是分成两个命令。

$ export LC_COLLATE=C 
$ ls [A-C]* 
+2

在LC_COLLATE = C ls [A-C] *'的例子中,'LC_COLLATE'被设置为执行'ls' - 但是在执行发生之前,glob被展开**。这也是为什么's = hello echo $ s'不能像人们所期望的那样工作的原因。 –