2013年2月4日 星期一

Linux 檔名包含特殊符號或是空白的檔案、目錄夾,也可搜尋出來直接刪除。

Linux 檔名包含特殊符號或是空白的檔案、目錄夾,也可搜尋出來直接刪除。

緣起,又是抓片子的時候遇到的問題之一,老手都知道片子100%的時候,目錄底下絕對不會只有avi和jpg而已,都會夾雜一些蝦密*.mht *.chm *.url *.txt之類的垃圾檔案,一個個刪除絕對是笨蛋的行為(我做了好幾年的笨蛋 = =")。

那有什麼指令可以把要刪除的檔案一次清光光呢?  這時候真的會覺得Linux真的很好用。
如果用土法煉鋼的 rm 指令保證會吐血,因為很多的檔名都不是只有英文+數字而已,有的還會夾雜其它的奇怪符號,或是最討厭的空白,這時候你就會很度濫。


那怎麼辦呢? 粉簡單,只要打一串指令就搞定!

linux@linux:/$ find -name "*.mht" -exec rm -rf {} \;

-exec 是代表搜尋完的結果交給後面執行的程式。
rm -rf 是強制刪除目錄夾(包含底下裡面的檔案)不過問。
{} 是代表搜尋結果的內容,這個可以做很多變化,例如原本 rm 指令改用 mv 就變的可以更改檔名。
 \; 是代表指令結束,這個一定要加在最後,不加的話執行會錯誤。


而上面指令的"*.mht"可以更改成你要的檔案類型,如以下所示:

"*.jpg" 搜尋所有附檔名是小寫的jpg檔案並且刪除。
"*.[jJ][pP][gG]" 搜尋所有附檔名是jpg檔案,不論大小寫並且刪除。
"abc*" 搜尋abc檔名開頭的所有檔案並且刪除。
"abc*.jpg" 搜尋abc檔名開頭的jpg檔案並且刪除。
"*abc*" 搜尋檔名中間有abc的檔案並且刪除。
"*abc*.jpg" 搜尋檔名中間有abc的jpg檔案並且刪除。


以上的範例還有一個小問題,如果想要搜尋的檔名很長而且也不知道大小寫的時候,那可就麻煩了。

例如: "sdhGSDvassdrfhDDFFsklklsddD" 這種整人的檔名就很GY阿,可是真的要找到它難道要像上面寫的一樣,每個字都要入大小寫才能嗎? no no no,科技始終來自於人性,人性來自於惰性,作者早就想到了啦!!!

linux@linux:/$ find -iname "sdhGSDvassdrfhDDFFsklklsddD" -exec rm -rf {} \;


鄉親們!!   看到沒,就這麼簡單,換個參數就搞定,把原本的 -name 改成 -iname 就好囉。


以此類推,剩下的自己搞定!