du 無法存取檔案 - 沒有此類檔案或目錄錯誤

du 無法存取檔案 - 沒有此類檔案或目錄錯誤

我在特定資料夾內有很多子資料夾,而這些子資料夾又包含很多較小的檔案。它們是透過程式設計創建的,所以我不知道裡面有多少個。

我決定刪除所有這些子資料夾和文件,因此我發出了命令,

rm -rf foldername/

然而, rm 命令花費了很多時間來執行,我認為這是完全正常的,因為它必須取消所有文件的連結。

但是,我決定透過發出命令來檢查該資料夾的大小是否減少,

du -sh foldername/

但是,上面的命令給我的錯誤是,

du: cannot access `foldername/file': No such file or directory

為什麼會發生這個錯誤?

答案1

du與任何遞歸遍歷目錄樹的命令一樣,按以下方式操作:

  1. 讀取有關文件的信息,透過其路徑存取。在 的情況下du,系統調用stat提供檔案類型(特別是是否是目錄)和大小。最初,名稱取自命令列。
  2. 如果檔案是目錄,打開它和文件名列表。
  3. 對於目錄中的每個檔案名,建構一個檔案路徑 ( ) 並從步驟 1 開始遞歸地對其進行操作。DIRECTORY/ENTRY_NAME

rm正在運行並一一刪除檔案。有時,du會在步驟 2 中讀取檔案名,但當它在步驟 3 中處理該檔案時,rm已將其刪除。您是否會看到此錯誤以及出現多少次取決於 和 的相對速度,rm並且du幾乎是不可預測的。

1 直接存取文件只有兩種方法:透過路徑(包括目錄信息,相對或絕對),或(如果文件開啟)通過描述符。

答案2

忽略du指令錯誤即可

按照du鏈接,我可以通過提及來忽略錯誤,

du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)

但我更具體地想知道刪除文件時發生了什麼。我特別想知道為什麼該du命令無法給出大小以及為什麼當該rm命令取消連結文件時它會報告錯誤。

這在中進行了解釋關聯。我只是重新表達一下,看看這裡發生了什麼事。

  1. rm命令已取消文件連結。 (即從其父目錄中刪除檔案名稱條目)。
  2. 但是,儘管沒有與其關聯的檔案名,但檔案句柄仍然有效。這是du命令報告它沒有看到文件或目錄的地方。

確認

我做了一些更多的研究來驗證這些文件實際上沒有連結。

pid使用命令獲取了 rm 進程的資訊ps。現在,我發出以下命令來查看文件是否仍然可用。

lsof +L | grep 11771

上面的命令給了我下面的輸出。

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

因此,根據上面的輸出,該文件已取消連結。

由於該rm命令仍在運行,因此該du命令報告錯誤。

相關內容