2011-11-16 112 views
1

如何刪除當前目錄中的所有文件 - 但不是那些在標題中有1.65的文件?Bash正則表達式

我試圖捕捉這些文件與

*[^1][^\.][^6][^5]* 
*[^\(1\.65\)]* 

(可以按Alt-*擴大正則表達式)

,但它不工作。下面是實驗代碼:

touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris [email protected] 
+2

順便說一下,正則表達式不能像那樣工作。如果有辦法使它匹配,則正則表達式會找到它,並報告匹配。因此,對於您的正則表達式示例,正則表達式引擎會發現foo1.65bar匹配,因爲'f'匹配'[^ 1]',第一個'o'匹配'[^。]'(不需要反斜槓,btw ),第二個'o'匹配'[^ 6]','1'匹配'[^ 5]'。這也是爲什麼有不同的正則表達式引擎和爲什麼globbing不使用正則表達式的解釋;每個工具都適用於特定的目的。 – tripleee

回答

4

它往往是更可靠,更表現爲使用找到這樣的工作:

find -mindepth 1 -maxdepth 1 '(' -type f -and -not -name '*1\.65*' ')' -delete 
+1

+1,但不需要括號:) – unbeli

+2

@unbeli:夠公平的。只要'-delete'在線上,我就傾向於把它們放在一起,以確保'find'使用* my *關於運算符優先順序的想法。 – thiton

3

您可以使用extended globbing ..(慶典4)

touch a b c foo1.65bar foo1_65bar 
ls 
echo ====== 
shopt -s extglob 
rm !(*1.6*) 
ls 

輸出

a b c foo1_65bar foo1.65bar 
===== 
foo1.65bar 
+0

謝謝,我從來沒有聽說過。從一個角度來看 - 支持正則表達式很酷。另一方面 - 不得不學習更多的正則表達式概念 - 爲什麼他們不符合[PCRE](http://en.wikipedia.org/wiki/Pcre)。 – Adobe

+1

@Adobe。我認爲這是因爲'bash'不得不將這個擴展匹配適應現有的框架,如果按照PCRE實現正則表達式,它將會中斷.. –

+2

@Adobe這是因爲PCRE與普通shell匹配太不同了,非常容易讓外殼匹配的混淆與正常行爲完全不同。例如,如果您鍵入'foo.txt'作爲參數,並且PCRE匹配生效,它會將該句點與任何單個字符相匹配(相當於正常通配中的'foo?txt')。另一方面,'* .txt'是一個無效的RE,因爲'*'的意思是「0或更多的最後一個東西」,並且在模式的開始處沒有「最後的東西」。 –

0

你可以在Ruby,Python,Perl等文件名中使用像下面這樣的正則表達式。然後你必須用所選語言編寫一個小腳本或一個班輪來完成這項工作。它使用負向預測。 (CFR)。​​。

^((?!1\.65).)*$ 

如果你想建立一個正則表達式,將不是一個特定的字符串匹配,你不能因爲它指定單個字符,而不是所有的人都在使用順序[]。你必須使用lookaround結構。

+0

嗯 - 這對我來說太難了。但是,無論如何謝謝你的信息。 – Adobe