2012-07-11 69 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

相關問題