Directory

rm 可以遞歸刪除空目錄嗎?

  • October 7, 2019

在舊版本的 Unix 中,rm如果目錄為空,該命令將刪除目錄。來自 rm 的研究 Unix 第八版手冊頁:“如果一個條目是一個目錄,它只有在為空時才會被刪除。” 我喜歡這種行為,所以我在我的/etc/profile:alias rm='rm -d'我使用的是 GNU coreutils 版本的 GNU coreutils 版本rm,其中-d告訴rm繼續刪除目錄,如果它們是空的。

到現在為止還挺好。這個別名讓我可以rm像過去一樣使用。但是,我想更進一步。我想要rm刪除一個目錄,即使該目錄包含其他目錄,只要目錄是那裡唯一的東西。目錄結構有多深並不重要,只要裡面沒有任何文件,只是空的(一旦你到達底部)目錄,我想rm將它們全部刪除。

這可以寫成一個別名,它仍然可以作為正常函式rm並刪除傳遞給它的任何文件嗎?

您想遍歷目錄樹並查看它是否包含目錄以外的任何內容。這超出了rm他的能力。您需要其他工具,例如find. 您可以通過這種方式刪除給定目錄下的空目錄(-depth導致空的父目錄也被刪除):

find "$x" -depth -type d -exec rmdir {} +

這是一個函式,對於每個參數,如果參數是非目錄文件或目錄樹不包含目錄以外的任何內容,則刪除該參數。請注意,此函式不是原子的:如果其中一個參數在執行時發生更改,您可能會收到一條錯誤消息,但它是安全的,因為它不會刪除作為參數傳遞的目錄中的任何非目錄。

rm () {
 ret=0
 for x; do
   case $x in -*) x=./$x;; esac
   if [ -d "$x" ]; then
     if [ -n "$(find "$x" ! -type d | head -n 1)" ]; then
       echo 1>&2 "$x: non-empty directory tree"
       ret=2
     else
       find "$x" -depth -exec rmdir {} +
       if [ -d "$x" ]; then ret=2; fi
     fi
   else
     command rm "$x" || [ $ret -gt 1 ] || ret=2
   fi
 done
 return $ret
}

引用自:https://unix.stackexchange.com/questions/104300