有一些操作順序嗎rm
?我rm
在一個大目錄上執行操作,很好奇我應該在哪裡查看可能已刪除的內容。是否rm
先對檔案起作用,然後對目錄起作用?還是根據inode表中的一些資訊?
規格:來自 GNU coreutils 8.22 系統的 rm:運行在 beagleboneblack 檔案系統上的 Arch Linux 是使用 USB 2.0 的外部 Seagate HDD (ext4)。
背景故事:
我正在執行一些目錄清理並執行
cp -r A/ B/ C/ Dest/
不知不覺中,我跟進了
rm -r A/ B/ C/ Dest/
當我只想簡單地表演時
rm -r A/ B/ C/
我發現了這一點,並在不久之後點擊了Ctrl+ 。具體來說,由於我將該命令與&結合C使用,所以時間不到 3 秒。我進去檢查了一下,以為它不存在,但你瞧,它是完整的,而且time
rm
cp
Dest/
出現了以免受到影響。這有點令人驚訝,因為A/
B/
C/
規模很小。總計可能為 100–200 MB。Dest/
然而,僅略低於 1TB。對 Dest/執行ls
顯示,字母表的兩端都有文件和目錄(例如AFile.txt
.... .... Zoo.txt
)。
我是否很幸運並rm
在它對我的 Dest/ 目錄造成嚴重破壞之前取消了它?真的那麼慢嗎rm
(謝天謝地!)?
如果沒有,如何rm
遞歸地刪除一些東西,以便我可以猜測可能丟失了什麼?
我並不是真的期待恢復我可能失去的東西,只是好奇可能被吹走的東西。
答案1
rm -r
依序處理它的每個參數。如果參數是一個目錄,它會列出該目錄(帶有opendir
和readdir
函數或某些等效方法),並依序對每個條目進行操作。如果條目是目錄,它將遞歸地探索該條目。
這與其他應用程式用於遞歸遍歷目錄的方法完全相同 - find
、ls -Rf
等。
遍歷的順序是不可預測的。在大多數文件系統上,只要目錄中沒有添加、刪除或重命名文件,順序就可以重現(理論上,順序可以完全隨機並且每次都會改變,但我無法想到會發生這種情況的文件系統)。在一些文件系統上,順序通常可以從文件名或創建文件的順序或兩者的組合來推斷,但您需要了解文件系統的詳細信息,並且它可能會有所不同,具體取決於驅動程式版本。遍歷的順序不是你可以依賴的。
請注意,ls
或echo *
按檔案名稱的字典順序對檔案進行排序。find
並且ls -f
不排序。
您可以信賴的一件事是參數是按順序處理的。因此,如果C/
仍然部分存在,則表示Dest/
沒有受到影響。如果消失了,您可以透過檢查目錄修改時間並將其與刪除時間或複製結束時間進行比較C/
來了解檔案已刪除的位置。要刪除的第一個文件可能是直接位於層次結構中或位於層次結構深處的文件,這取決於碰巧遍歷的第一個條目是否是目錄。Dest/
C/
Dest/
Dest/
rm
速度rm
主要取決於要刪除的檔案數量。文件非常大才會對刪除時間產生明顯影響。大部分工作是依序刪除每個目錄項目。文件的資料不會被刪除,刪除文件的內容只需將其正在使用的區塊標記為空閒,相對較快。
答案2
正如 Gilles 所說,您通常無法預測目錄中的刪除順序,只能預測頂級目錄將按照命令列上的順序進行處理。
然而,你也可以保證它會從下往上刪除目錄層次結構,因為 Unix 只允許刪除空目錄。因此,為了刪除目錄,首先必須刪除其中的所有內容。如果它包含子目錄,則必須先刪除其內容,依此類推。