2016-02-07 60 views
0

我有一組目錄(在當前目錄中),我正在將其排序文件。源文件或者位於當前目錄中,或者位於其他目錄中(通常深度很多),它也包含在其中。使用-type -regex和-prune查找

我收到了使用find查找的文件列表,使用-type -regex和-prune排除目標目錄中的文件,然後使用另一個-regex選擇文件。

至少,這就是我的意圖和文件列表是正確的 - 有一個例外:目標目錄出現在列表中(但不是他們已經包含的文件 - 這是所需的行爲)。

我有一個解決方法:在隨後的循環中,我放棄了任何不是文件的東西。

我相信在目錄排除正則表達式中有一個簡單的錯誤我錯過了 - 普隆應該做的事情。

這裏是我的代碼(我用的是Mac - 因此-E選項):

find -E . \ 
-type d -regex './(DVD|quarantine|720|high|low|error)' -prune -o \ 
-type f -regex '.*.(avi|wmv|mp4|m4v|mov|mkv)' 

...和最後一個問題:如何讓我的文件選擇正則表達式的情況下不敏感

+1

GNU find具有'-iregex'選項,它與'-regex'類似,但不區分大小寫。 –

回答

3

這裏的find手冊頁的相關部分:

-print This primary always evaluates to true. It prints the pathname of the current file to standard output. If 
     none of -exec, -ls, -print, -print0, or -ok is specified, the given expression shall be effectively replaced 
     by (given expression) -print. 

所以,因爲你的命令行什麼都沒有的-exec-ls-print-print0-ok規定,這是一樣的,如果你的命令一直:

find -E . \ 
\(-type d -regex './(DVD|quarantine|720|high|low|error)' -prune -o \ 
    -type f -regex '.*.(avi|wmv|mp4|m4v|mov|mkv)' \) -print 

的解決方案是對右側的顯式-print(或-print0):

find -E . \ 
-type d -regex './(DVD|quarantine|720|high|low|error)' -prune -o \ 
-type f -regex '.*\.(avi|wmv|mp4|m4v|mov|mkv)' -print 

而且,在註釋中提到的正則表達式可以做的情況下,通過使用-iregex不敏感。

或者,如果你願意,你還可以嵌入不區分大小寫的表達式本身(見re_format手冊頁):

find -E . \ 
-type d -regex './(?i:DVD|quarantine|720|high|low|error)' -prune -o \ 
-type f -regex '.*\.(?i:avi|wmv|mp4|m4v|mov|mkv)' -print 

編輯:沒有,-iregex是實現不區分大小寫的唯一途徑。

+0

謝謝。這很好地解釋了我的誤解。 – Lorccan

+0

我遇到了問題。我只是在文件選擇部分使用了嵌入式大小寫不敏感,我得到這個錯誤:find:-regex:。* \。(?i:avi | wmv | mp4 | m4v | mov | mkv):重複操作符操作數無效 – Lorccan

+0

使用-iregex修復它。也許這是另一個與mac有關的事情? – Lorccan