在阅读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]
,然后在我的期望中它应该与第二个命令相反。
答案 0 :(得分:4)
!
是否定括号表达式的标准字符。 *[!t]*
表示匹配零个或多个任意字符,后跟除 a t
之外的任何内容,后跟零个或多个任意字符。换句话说,匹配包含t
以外的字符的任何文件名。它不匹配的文件名包含t
的{em>仅:t
,tt
,ttt
等。
如果您只想匹配不包含任何 t
的文件名,请参阅Charles Duffy的答案,因为他打败了我。
答案 1 :(得分:4)
这个glob:
echo *[!t]*
将找到其中至少包含一个非t
字符的文件名。
因此,如果您的文件名为t
,tt
,ttt
,那么这些文件名将不会使用此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