2011-07-19 63 views

回答

28

這裏你不需要一個正則表達式。您可以使用find-name-not選項:

find . -not -name "*.jar" -not -name "*.ear" 

更簡潔(但不讀)以上版本是:

find . ! \(-name "*.jar" -o -name "*.ear" \) 
+1

+1,因爲它更具可讀性,因此有人建議這樣做。 – carlpett

+0

我同意,正則表達式可能會矯枉過正。 –

+0

你是對的,但我想,因爲我使用它作爲一個功能,使之儘可能通用,不知道會有怎樣的最終用戶的需求 – Michael

11

編輯:新方法:

由於POSIX正則表達式不支持環視,你需要否定匹配結果:

find . -not -regex ".*\.[je]ar" 

先前公佈答案使用回顧後,因此在這裏不起作用,但這裏是爲了完整性:

.*(?<!\.[je]ar)$ 
+0

似乎無法使其在命令中工作。我正在使用'find。 -type'f'-regextype posix-extended -regex'。*(?<!\。[je] ar)$''它給了我警告:在非選項參數後面指定了-regextype選項 - 類型,但選項不是位置的(-regextype會影響在它之前指定的測試以及在它之後指定的測試)。請在其他參數前指定選項。 ' – Michael

+0

聽起來對我來說,就像你需要在'regex'選項後面放置'regextype'選項一樣。但是'posix-extended'聽起來不對, POSIX沒有lookai的AFAIK。 –

+0

糟糕。它看起來像'find'只支持POSIX BRE/ERE引擎。在這種情況下,這個解決方案根本不能工作。比較遺憾的是(誰upvoted這個?)... –

0

在這種情況下使用正則表達式聽起來像一個矯枉過正(你可以檢查名稱是否以某種方式結束)。我不知道Emacs的語法,但這樣的事情應該是通用的,足以工作:

\.(?!((jar$)|(ear$))) 

即找一個點後面沒有結束($)「JAR」或(|)「耳(。) 」。

+0

如果文件名不包含點,該怎麼辦?或多個點? (除了'-regex'選項匹配整個文件名,而不僅僅是它的一部分) –

4
find . -regextype posix-extended -not -regex ".*\\.(jar|ear)" 

這將完成這項工作,我個人發現它比其他一些解決方案更清晰。不幸的是,-regextype是必需的(混淆了其他簡單的命令)以使捕獲組工作。