在非常大的文件夾上 rm -Rf 期間的實際步驟順序是什麼?
假設我
rm -Rf
在一個非常大的文件夾上執行,其中包含許多不同大小、使用者權限等的文件和文件夾。我想知道,該
rm
命令是否首先累積要刪除的文件列表,並且只有在掃描整個文件夾以查找這些文件後才開始刪除?或者它實際上是否在命令期間一旦命中就刪除每個文件?例如,假設您執行
rm -Rf /
命令並在 5 秒後終止它,它會同時刪除任何內容嗎?該特定安裝文件夾上的 fs 是
ext4
.
如果您執行
rm -Rf /
,rm
將輸出一條錯誤消息並停止,如POSIX 所指定:如果操作數解析為根目錄,rm將向標準錯誤寫入診斷消息,並且不再對此類操作數執行任何操作。
在其他情況下,或者如果您強制
rm
處理/
(假設您的版本可以強制執行,例如rm
帶有--no-preserve-root
選項的GNU ),請rm
盡快刪除文件和目錄。它以深度優先的順序處理目錄,以便在目錄被清空時刪除它們。所以在你的五秒鐘內,很可能會刪除文件和目錄。這是由 POSIX 指定的(參見上面的連結):
對於每個文件,應採取以下步驟:
- 如果文件不存在:
一種。如果未指定**-f選項,則**rm應將診斷消息寫入標準錯誤。
灣。繼續任何剩餘的文件。 2. 如果文件是目錄類型,則應採取以下步驟:
一種。如果-R選項和**-r**選項均未指定,則rm應將診斷消息寫入標準錯誤,不再對file執行任何操作,然後繼續處理任何剩餘的文件。
灣。如果file是一個空目錄,rm可能會跳到步驟 2d。如果未指定**-f選項,並且文件的權限不允許寫入並且標準輸入是終端,或者指定了-i**選項,則rm將向標準錯誤寫入提示並從標準輸入中讀取一行. 如果響應不是肯定的,則rm將不再對目前文件執行任何操作並繼續處理任何剩餘的文件。
C。對於file中包含的每個條目,除了 dot 或 dot-dot,此處列出的四個步驟(1 到 4)應與條目一起執行,就好像它是文件操作數一樣。rm實用程序不應通過跟隨符號連結進入層次結構的其他部分來遍歷目錄,但應刪除連結本身。
d。如果指定了**-i選項,rm將向標準錯誤寫入提示並從標準輸入中讀取一行。如果響應不是肯定的,rm將不再對目前文件做任何事情,並繼續處理任何剩餘的文件。 3. 如果file不是directory類型,沒有指定-f選項,或者file的權限不允許寫入並且標準輸入是終端或者指定了-i**選項,rm應該寫一個標準錯誤提示並從標準輸入中讀取一行。如果響應不是肯定的,則rm將不再對目前文件執行任何操作並繼續處理任何剩餘的文件。 4. 如果目前文件是目錄,則rm應執行與 POSIX.1-2017 系統介面卷中定義的rmdir()函式等效的操作,該函式使用目前文件的路徑名作為路徑參數呼叫。如果目前文件不是目錄,則rm應執行與 POSIX.1-2017 的系統介面卷中定義的unlink()函式等效的操作,該函式使用目前文件的路徑名作為路徑參數呼叫。
如果由於任何原因失敗,rm將向標準錯誤寫入診斷消息,不再對目前文件執行任何操作,並繼續處理任何剩余文件。
rm實用程序應該能夠下降到文件層次結構中的任意深度,並且不會由於路徑長度限製而失敗(除非使用者指定的操作數超出系統限制)。