2015-04-01 54 views
1

假設我有以下目錄結構BASH extglob否定不工作,我希望

./testdir 
./testdir/a.c 
./testdir/b.c 
./testdir/testdir2/ 
./testdir/t.tar 

,並假設我的CWD是TESTDIR,我想呼應的是沒有的.tar擴展名的所有目錄條目。

這工作:

echo *.!(tar) 

不過,我預計產生相同的結果,但它並不:

echo *!(tar) 

只有週期從第二個命令丟失。第二個echo命令列出了d.tar文件。星號glob字符應該匹配所有字符,extglob否定字符應該列出任何不以tar結尾的內容。

回答

2

讓我們先從這些文件:

$ ls 
a.b b.c testdir2 t.tar 

此相匹配的是有一段時間,但沒有tar後一段時期的所有文件:

$ echo *.!(tar) 
a.b b.c 

這符合不與結尾的所有文件tar

$ echo !(*tar) 
a.b b.c testdir2 

這是extglob th在有意外,但是不應該:

$ echo *!(tar) 
a.b b.c testdir2 t.tar 

*本身可以匹配任何東西,如t.tar。由於沒有必要在t.tar之後添加tar,這是匹配。

+0

此答案有幫助。很容易像在某些正則表達式規則集中使用*一樣錯誤地考慮星號字符。這裏的教訓:不要混淆正則表達式*和BASH *。他們不一樣。 – user2365114 2015-04-01 04:08:16

2

*!(tar)位不是相交的互補球狀集。

它們形成一個必須擴展的單個glob。

我猜t.tar匹配的東西像t.tar匹配*和「」匹配!(tar)

你想要的glob是!(*tar)。任何不是匹配*tar glob。

+0

這個答案對我來說是最有用的,這是一個明顯的錯誤,不是用!(*單詞)代替!(單詞)......如果它是由我決定的話,我會接受這個答案 – jimh 2016-04-01 20:20:50