我正在尝试使用bash中的通配符,并尝试列出所有以“xyz”开头但不以“.TXT”结尾的文件,但结果不正确。
这是我尝试过的命令:
$ ls -l xyz*[!\.TXT]
我没有在目录中列出名称为“xyz”和“xyzTXT”的文件。但是,它列出了“xyz1”,“xyz123”。
似乎在“xyz *”之后添加[!\.TXT]
使shell查找以“xyz”开头并且后面至少有一个字符的内容。
任何想法为什么会发生以及如何纠正这个命令?我知道它可以使用其他命令来实现,但我特别感兴趣的是知道它为什么失败以及它是否只能使用通配符。
答案 0 :(得分:7)
这些命令可以满足你的需要
shopt -s extglob
ls -l xyz!(*.TXT)
shopt -u extglob
你的命令不起作用的原因是因为xyz * [!\。TXT]相当于xyz * [!\。TX]意味着xyz后跟任何字符序列(*),最后是一个字符设置{!,\,。,T,X}以匹配'xyzwhateveryouwant!' 'xyzwhateveryouwant \''xyzwhateveryouwant。' 'xyzwhateveryouwantT''xyzwhateveryouwantX'
编辑:其中每个人都不包含任何!\。TX
答案 1 :(得分:4)
我认为只有通配符才能做到这一点。
您的命令无效,因为它意味着:
匹配xyz
后跟任意内容的所有内容,并且不得以后续字符结尾:\
,.
,T
和X
。第二个T
不计算在[]
内的内容被视为一个字符系列,而不是您想象的字符串。
只要在通配符中没有特殊含义,您就不需要“转义”.
。
至少,这是我对通配符的了解。