
我在特定資料夾內有很多子資料夾,而這些子資料夾又包含很多較小的檔案。它們是透過程式設計創建的,所以我不知道裡面有多少個。
我決定刪除所有這些子資料夾和文件,因此我發出了命令,
rm -rf foldername/
然而, rm 命令花費了很多時間來執行,我認為這是完全正常的,因為它必須取消所有文件的連結。
但是,我決定透過發出命令來檢查該資料夾的大小是否減少,
du -sh foldername/
但是,上面的命令給我的錯誤是,
du: cannot access `foldername/file': No such file or directory
為什麼會發生這個錯誤?
答案1
du
與任何遞歸遍歷目錄樹的命令一樣,按以下方式操作:
- 讀取有關文件的信息,透過其路徑存取。在 的情況下
du
,系統調用stat
提供檔案類型(特別是是否是目錄)和大小。最初,名稱取自命令列。 - 如果檔案是目錄,打開它和讀文件名列表。
- 對於目錄中的每個檔案名,建構一個檔案路徑 ( ) 並從步驟 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
命令取消連結文件時它會報告錯誤。
這在中進行了解釋這關聯。我只是重新表達一下,看看這裡發生了什麼事。
- 該
rm
命令已取消文件連結。 (即從其父目錄中刪除檔案名稱條目)。 - 但是,儘管沒有與其關聯的檔案名,但檔案句柄仍然有效。這是
du
命令報告它沒有看到文件或目錄的地方。
確認
我做了一些更多的研究來驗證這些文件實際上沒有連結。
我pid
使用命令獲取了 rm 進程的資訊ps
。現在,我發出以下命令來查看文件是否仍然可用。
lsof +L | grep 11771
上面的命令給了我下面的輸出。
rm 11771 root 4r DIR 8,17 175882240 2 47333397 /foldername/filename
因此,根據上面的輸出,該文件已取消連結。
由於該rm
命令仍在運行,因此該du
命令報告錯誤。