2017-05-31 92 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,见查尔斯·达菲的答案文件名,他打败了我。

相关问题