Filesystems

僅當目錄不是掛載點時才安全刪除目錄

  • September 27, 2017

不幸的是,我被迫使用一個軟體,它處理自動掛載和解除安裝網路卷的效果很差;它有一種令人討厭的傾向,即離開掛載點所在的目錄,但在稍後再次掛載卷時無法正確處理這種情況(它應該整理但通常不會整理)。

當然,我會在開發人員那裡解決這個問題,但與此同時,我需要自己做一些事情來整理安裝點。

所以基本上我需要做的是刪除目錄,但前提是它目前不是安裝點(因為我不想意外刪除卷的內容)。

現在,我可以輕鬆地獲取目錄的設備 ID 並將其與 root 的設備 ID 進行比較,但是如果我使用這樣的比較,即如果在檢查設備 ID 之間安裝了卷,則可能會出現競爭條件並打電話rm -r /mnt/point

有沒有其他選擇?find我對使用命令選項的可能性很感興趣-xdev,但我不確定我將如何實際提供一個比較點,因為find /mnt/point -xdev目標及其內容是相同的設備時不起作用。

此外,rmdir假設剩余文件夾始終為空似乎不可靠,因為在某些系統上,掛載點內部可能有文件;例如,macOS 會在其中保留一個.autodiskmounted文件。雖然我可以創建此類案例的列表並處理它們,但如果有可能的話,最好有一個更通用的解決方案供將來參考(希望對其他人有用)。

如果該目錄是一個掛載點,它將很忙,您不應該重命名它。

$ sudo mv /mnt /mnt.old
mv: cannot move '/mnt' to '/mnt.old': Device or resource busy

如果它只是一個正常目錄,您應該能夠重命名它。

$ sudo mv /mnt /mnt.old

如果移動成功,重新創建掛載目錄並刪除重命名的目錄。或者,您可以在刪除之前驗證重命名的目錄是您期望的文件系統的一部分。

如果您使用的是 Linux

您可以使用mountpoint.

為避免掛載點在 test 和 之間出現/消失rm -r,您需要在具有私有子樹的單獨掛載命名空間中執行腳本(掛載不會從/傳播到新命名空間)。這可以通過.unshare

unshare -m --propagation private -- "<delete script>"

一切都在同一個腳本中:

#!/bin/sh

unshare -m --propagation private -- sh -e <<EOF

if ! mountpoint -q "<path>"; then
   rm -r "<path>"
fi

EOF

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