2017-04-07 97 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'不能像人們所期望的那樣工作的原因。 –