Filesystems
僅當目錄不是掛載點時才安全刪除目錄
不幸的是,我被迫使用一個軟體,它處理自動掛載和解除安裝網路卷的效果很差;它有一種令人討厭的傾向,即離開掛載點所在的目錄,但在稍後再次掛載卷時無法正確處理這種情況(它應該整理但通常不會整理)。
當然,我會在開發人員那裡解決這個問題,但與此同時,我需要自己做一些事情來整理安裝點。
所以基本上我需要做的是刪除目錄,但前提是它目前不是安裝點(因為我不想意外刪除卷的內容)。
現在,我可以輕鬆地獲取目錄的設備 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