2017-05-31 96 views
3

我真的不知道在閱讀glob (programming)的結果打印下面的命令在shell中,我使用(bash)作爲我的shell。鑑於此目錄層次結構:爲什麼glob`* [!t] *`返回名稱包含`t`的文件?

/sub2 
    s.py 
    t2.txt 
    nametoname.txt 
    bees.txt 
    /sub22 

$ echo *[!t]* 
bees.txt nametname.txt s.py sub22 t2.txt 

在我的理解的參數echo將擴大到匹配不包含字母T的任何文件名,但結果卻完全相反,爲什麼?

該命令輸出所有文件名是包含字母t:

$ echo *[t]* 
nametname.txt t2.txt 

在前面的命令我只是否定[t][!t],然後在我的期望它應該做的第二個命令相反。

回答

4

這水珠:

echo *[!t]* 

會找到任何文件名,在它至少一種非t字符。

因此,如果您的文件名爲ttt,ttt那麼這些文件名將不會使用該glob列出。

解決方案:

如果要列出沒有信t在它的文件名,那麼你可以使用這個命令find

find . -maxdepth 1 -mindepth 1 -not -name '*t*' 

您也可以增加-type f上市文件只有或-type d僅列出目錄。

+1

你或許應該使用'-name',不'這裏-iname',要與水珠的情形相一致嚴格。 – kojiro

+0

感謝@kojiro,有道理。我編輯過。 – anubhava

+0

然後我可以說'echo * [t] *'將匹配包含至少一個t的任何文件名。 – direprobs

4

!是否定括號表達式的標準字符。 *[!t]*表示匹配零個或多個任意字符,其次是任何,除了 a t,後面跟零個或多個任意字符。換句話說,匹配任何包含除t之外的字符的文件名稱。什麼也不會匹配是由只是t小號文件名:tttttt

如果你只想匹配不包含任何t,見查爾斯·達菲的答案文件名,他打敗了我。

相關問題