5

我正在尝试使用 bash 中的通配符,并尝试列出所有以“xyz”开头但不以“.TXT”结尾但得到不正确结果的文件。

这是我尝试过的命令:

$ ls -l xyz*[!\.TXT]

它没有列出我目录中名称为“xyz”和“xyzTXT”的文件。但是,它列出了“xyz1”、“xyz123”。

似乎[!\.TXT]在“xyz *”之后添加会使外壳程序寻找以“xyz”开头并且后面至少有一个字符的东西。

任何想法为什么会发生以及如何更正此命令?我知道它可以使用其他命令来实现,但我特别想知道它失败的原因以及它是否可以仅使用通配符来完成。

4

2 回答 2

7

这些命令会做你想做的事

shopt -s extglob
ls -l xyz!(*.TXT)
shopt -u extglob

您的命令不起作用的原因是因为 xyz*[!\.TXT] 相当于 xyz*[!\.TX] 意味着 xyz 后跟任何字符序列 (*),最后是集合中的一个字符 {! ,\,.,T,X} 所以匹配 'xyzwhateveryouwant!' 'xyzwhateveryouwant' 'xyzwhateveryouwant'。'xyzwhateveryouwantT' 'xyzwhateveryouwantX'

编辑:whateveryouwant 不包含任何 !\.TX

于 2012-07-11T16:27:40.437 回答
4

我不认为这仅使用通配符是可行的。

您的命令不起作用,因为这意味着:

匹配任何你想要的内容,xyz它不能以后续字符结尾:\,.和. 第二个并不重要,因为你里面的内容被读作一个字符系列,而不是你想象的字符串。TXT[]

.只要通配符内没有特殊含义,您也不需要“转义” 。

至少,这是我对通配符的了解。

于 2012-07-11T16:55:01.610 回答