2014-02-12 88 views
2

關於正確處理contain weird symbols like newlines的文件名有太多瞭解。我認爲使用IFS設置爲換行符將解決問題,除非明顯的情況下,如果一個名稱帶有換行符。所以作爲一種防禦手段,腳本可以首先檢查一個子樹是否至少有一個帶有換行符的文件,並停留一條消息來首先修復名稱。 令人驚訝的是,我不能讓find-regex匹配。只有成功的方式是相當醜陋如何查找名稱中包含換行符的文件

find . -name "*"$'\n'"*" 

但是,例如find . -regex ".*\n.*"不起作用。 Emacs的正則​​表達式應該允許像\ n這樣的轉義字符,不是嗎?有趣的是,它匹配名稱中帶有字符n的另一個文件。使用不同的-regextypes進行實驗只能找到這種類型awksedposix-extended還有一些會用換行符匹配文件(比如說a\nxxx),但是除此之外,它們也會與文件n匹配。奇怪的。 另一方面,GNU查找文檔不會告訴任何有關支持轉義字符的任何內容,如\n。他們真的不被支持,所以我們不能在尋找正則表達式中使用\t \n \r \a和類似的東西嗎?

回答

3

要查找所有的文件和目錄,在他們新的生產線,你可以使用這個POSIX兼容的調用find

find . -name '* 
*' 

其中字面換行符嵌入在單引號。 bash支持額外的語法來指定一個新行:

find . -name \*$'\n'\* 

或者少一點笨拙:

EOL=$'\n' 
find . -name "*$EOL*" 

或者使用-regex

find . -regex ".*$EOL.*" 
+0

事實上,這是可行的。但是find -regex測試會有類似的可能嗎?到目前爲止似乎不是,但無論如何感謝。 –

+0

有可能,請參閱更新的答案,只需用'。*'替換'*'即可。 – anubhava

+3

+1我添加了一個POSIX兼容版本,因爲它似乎不值得添加一個競爭的答案,這樣一個小的差異。 – chepner

相關問題