Directory
rm 可以遞歸刪除空目錄嗎?
在舊版本的 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 }