您好,登錄后才能下訂單哦!
之前看過oldboy(老男孩)前輩的一篇文章《linux面試題:刪除一個目錄下的所有文件,但保留一個指定文件》,近日終于有機會得以驗證,但與老男孩前輩的文章中具體講的有些不太一樣,故而專門寫一篇文章重新整理這個問題。雖然是同一個話題,和同一種思路,但細節上有一定的差別。
需求:
刪除一個目錄下的所有文件,但保留一個指定文件。
場景與要求:
目錄下有目錄和文件,目錄下有子目錄和子文件(這是通常的場景)
目錄下有符號鏈接文件、隱藏文件等
如果是當前目錄,則需要排除當前目錄
執行成功則返回代碼0,并且不提示任何警告和錯誤
解決辦法:
例如刪除當前目錄下的所有文件,除了deploy.sh(原始場景:deploy.sh完成部署工作,但不需要此項目時,執行destroy函數,刪除當前目錄下的所有文件,除了deploy.sh文件本身)
簡單驗證,可以如此執行:
find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./"
如果是真的要刪除,則是(也是此文主要想表達的方式):
find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./" -exec rm -rf {} \;
如果放到腳本中執行,則可以(其中$WORKDIR是腳本工作目錄):
find -L $WORKDIR -maxdepth 1 ! -name "$(basename $0)" ! -wholename "$WORKDIR" -exec rm -rf {} \;
原理或解釋:
主要是利用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--
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。