为什么glob` * [!t] *`返回名称中包含`t`s的文件?

时间:2017-05-31 16:54:29

标签: bash shell unix

在阅读shell中以下命令打印的glob (programming)结果后,我真的不知道,我使用(bash)作为我的shell。给定此目录层次结构:

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

根据我的理解,echo的参数将被扩展为匹配不包含字母t的任何文件名,但结果恰恰相反,为什么?< / p>

此命令输出包含字母t的所有文件名:

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

在上一个命令中,我刚刚将[t]否定为[!t],然后在我的期望中它应该与第二个命令相反。

3 个答案:

答案 0 :(得分:4)

!是否定括号表达式的标准字符。 *[!t]*表示匹配零个或多个任意字符,后跟 a t之外的任何内容,后跟零个或多个任意字符。换句话说,匹配包含t以外的字符的任何文件名。它不匹配的文件名包含t的{​​em>仅:tttttt等。

如果您只想匹配不包含任何 t的文件名,请参阅Charles Duffy的答案,因为他打败了我。

答案 1 :(得分:4)

这个glob:

echo *[!t]*

将找到其中至少包含一个非t字符的文件名。

因此,如果您的文件名为tttttt,那么这些文件名将不会使用此glob列出。

<强>解决方案:

如果要列出其中没有字母t的文件名,则可以使用此find命令:

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

您也可以仅为列出文件添加-type f,或仅为列出目录添加-type d

答案 2 :(得分:4)

正如其他答案所示,*[!t]*会返回任何t字符的文件。

他们尚未提供的解决方法是:

shopt -s extglob  ## enable extglobs
echo !(*t*)       ## list files with names not containing t

请参阅http://wiki.bash-hackers.org/syntax/pattern#extended_pattern_language