如何刪除當前目錄中的所有文件 - 但不是那些在標題中有1.65
的文件?Bash正則表達式
我試圖捕捉這些文件與
*[^1][^\.][^6][^5]*
*[^\(1\.65\)]*
(可以按Alt-*
擴大正則表達式)
,但它不工作。下面是實驗代碼:
touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris [email protected]
如何刪除當前目錄中的所有文件 - 但不是那些在標題中有1.65
的文件?Bash正則表達式
我試圖捕捉這些文件與
*[^1][^\.][^6][^5]*
*[^\(1\.65\)]*
(可以按Alt-*
擴大正則表達式)
,但它不工作。下面是實驗代碼:
touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris [email protected]
您可以使用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
謝謝,我從來沒有聽說過。從一個角度來看 - 支持正則表達式很酷。另一方面 - 不得不學習更多的正則表達式概念 - 爲什麼他們不符合[PCRE](http://en.wikipedia.org/wiki/Pcre)。 – Adobe
@Adobe。我認爲這是因爲'bash'不得不將這個擴展匹配適應現有的框架,如果按照PCRE實現正則表達式,它將會中斷.. –
@Adobe這是因爲PCRE與普通shell匹配太不同了,非常容易讓外殼匹配的混淆與正常行爲完全不同。例如,如果您鍵入'foo.txt'作爲參數,並且PCRE匹配生效,它會將該句點與任何單個字符相匹配(相當於正常通配中的'foo?txt')。另一方面,'* .txt'是一個無效的RE,因爲'*'的意思是「0或更多的最後一個東西」,並且在模式的開始處沒有「最後的東西」。 –
你可以在Ruby,Python,Perl等文件名中使用像下面這樣的正則表達式。然後你必須用所選語言編寫一個小腳本或一個班輪來完成這項工作。它使用負向預測。 (CFR)。。
^((?!1\.65).)*$
如果你想建立一個正則表達式,將不是一個特定的字符串匹配,你不能因爲它指定單個字符,而不是所有的人都在使用順序[]
。你必須使用lookaround結構。
嗯 - 這對我來說太難了。但是,無論如何謝謝你的信息。 – Adobe
順便說一下,正則表達式不能像那樣工作。如果有辦法使它匹配,則正則表達式會找到它,並報告匹配。因此,對於您的正則表達式示例,正則表達式引擎會發現foo1.65bar匹配,因爲'f'匹配'[^ 1]',第一個'o'匹配'[^。]'(不需要反斜槓,btw ),第二個'o'匹配'[^ 6]','1'匹配'[^ 5]'。這也是爲什麼有不同的正則表達式引擎和爲什麼globbing不使用正則表達式的解釋;每個工具都適用於特定的目的。 – tripleee