2012-07-11 754 views
3

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

这里是我试过的命令:

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

它不上市与名称“某某”和“xyzTXT”我有我的目录中的文件。但是,它列出了“xyz1”,“xyz123”。

看起来好像在“xyz *”之后加上[!\.TXT]使得shell查找以“xyz”开头并且至少有一个字符的东西。

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

回答

4

我不认为这是可行的,只有通配符。

您的命令无法正常工作,因为这意味着:

比赛的一切,已其次是无论你想xyz,它不能与序贯字符结尾:\.TX。第二个T不会像你想象的[]那样被视为字符家族而不是字符串。

只要在通配符中没有特殊含义,您不需要'转义'.

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

+0

我想这是有道理的。谢谢。 – 2012-07-11 17:01:37

+0

@RameshSamane,做一些测试,例如,名为'xyzwhateverTXTyouwant','xyzwhateveryouwant.'和'xyzwhateveryouwantX'的文件。你的方法将为第一个工作,但会失败的另外两个。 – Zagorax 2012-07-11 17:04:02

+0

是的,你是对的。我证实了它。 – 2012-07-11 20:32:48

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

+1

是的,这种方法很有用,并且非常感谢这个解决方案,但是有任何想法为什么我尝试的命令对于“xyz”和“xyzTXT”文件不起作用? – 2012-07-11 16:37:19

+0

你的命令匹配所有以xyz开始并以!\结尾的文件。TX – 2012-07-11 18:41:55

+0

我用命令创建了两个文件:touch xyz!并触摸xyz。第一个以!结尾!被列出但不是以第二个结尾。 (点),我想!是为否定,但为什么它打印文件xyz!仍然是一个谜。 – 2012-07-11 20:22:31

相关问题