天天看點

删除一個目錄下的所有檔案但保留一個指定檔案

之前看過oldboy(老男孩)前輩的一篇文章《linux面試題:删除一個目錄下的所有檔案,但保留一個指定檔案》,近日終于有機會得以驗證,但與老男孩前輩的文章中具體講的有些不太一樣,故而專門寫一篇文章重新整理這個問題。雖然是同一個話題,和同一種思路,但細節上有一定的差别。

需求:

删除一個目錄下的所有檔案,但保留一個指定檔案。

場景與要求:

目錄下有目錄和檔案,目錄下有子目錄和子檔案(這是通常的場景)

目錄下有符号連結檔案、隐藏檔案等

如果是目前目錄,則需要排除目前目錄

執行成功則傳回代碼0,并且不提示任何警告和錯誤

解決辦法:

例如删除目前目錄下的所有檔案,除了deploy.sh(原始場景:deploy.sh完成部署工作,但不需要此項目時,執行destroy函數,删除目前目錄下的所有檔案,除了deploy.sh檔案本身)

簡單驗證,可以如此執行:

如果是真的要删除,則是(也是此文主要想表達的方式):

如果放到腳本中執行,則可以(其中$WORKDIR是腳本工作目錄):

原理或解釋:

主要是利用find指令結合rm指令,

-L 表示find時包含符号連結檔案

-maxdepth 1 表示查找目錄深度為1,也就是隻處理目錄下的目錄和檔案,其他的目錄中的檔案或目錄一概不做處理,如果不指定此參數,很有可能遭遇“No such file or directory”問題,原因是,find出來的内容是無法經過排序的,有時會造成父目錄已經被rm删除,子目錄的路徑資訊還會傳遞給rm,造成rm無法找到檔案或目錄,進而報錯。

! -name "$(basename $0)"  表示不包含目前腳本名字的檔案

! -wholename "$WORKDIR"  表示不包含腳本或指令所在的目前工作目錄,之是以用-wholename而不是-name是因為相容某些Unix系統,如果僅用-name會得到一條警告“find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name `./deploy.sh'' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ `./deploy.sh''.”。

tag:find和rm删除,find删除檔案,find符号連結檔案,find maxdepth用途,find删除

--end--