溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

刪除一個目錄下的所有文件但保留一個指定文件

發(fā)布時間:2020-06-22 12:49:35 來源:網(wǎng)絡(luò) 閱讀:3240 作者:urey_pp 欄目:開發(fā)技術(shù)

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

需求:

刪除一個目錄下的所有文件,但保留一個指定文件。

場景與要求:

  1. 目錄下有目錄和文件,目錄下有子目錄和子文件(這是通常的場景)

  2. 目錄下有符號鏈接文件、隱藏文件等

  3. 如果是當(dāng)前目錄,則需要排除當(dāng)前目錄

  4. 執(zhí)行成功則返回代碼0,并且不提示任何警告和錯誤

解決辦法:

例如刪除當(dāng)前目錄下的所有文件,除了deploy.sh(原始場景:deploy.sh完成部署工作,但不需要此項目時,執(zhí)行destroy函數(shù),刪除當(dāng)前目錄下的所有文件,除了deploy.sh文件本身)

簡單驗證,可以如此執(zhí)行:

find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./"

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

find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./" -exec rm -rf {} \;

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

find -L $WORKDIR -maxdepth 1 ! -name "$(basename $0)" ! -wholename "$WORKDIR"  -exec rm -rf {} \;

原理或解釋:

主要是利用find命令結(jié)合rm命令,

  • -L 表示find時包含符號鏈接文件

  • -maxdepth 1 表示查找目錄深度為1,也就是只處理目錄下的目錄和文件,其他的目錄中的文件或目錄一概不做處理,如果不指定此參數(shù),很有可能遭遇“No such file or directory”問題,原因是,find出來的內(nèi)容是無法經(jīng)過排序的,有時會造成父目錄已經(jīng)被rm刪除,子目錄的路徑信息還會傳遞給rm,造成rm無法找到文件或目錄,從而報錯。

  • ! -name "$(basename $0)"  表示不包含當(dāng)前腳本名字的文件

  • ! -wholename "$WORKDIR"  表示不包含腳本或命令所在的當(dāng)前工作目錄,之所以用-wholename而不是-name是因為兼容某些Unix系統(tǒng),如果僅用-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--

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI