目錄有980MB元數據,數百萬個文件,如何刪除? (ext3)

目錄有980MB元數據,數百萬個文件,如何刪除? (ext3)

可能的重複:
rm 包含數百萬個檔案的目錄

你好,

所以我被這個目錄困住了:

drwxrwxrwx 2 dan users 980M 2010-12-22 18:38 sessions2

目錄內容很小——只有數百萬個微小的檔案。

我想從檔案系統中刪除它,但一直無法做到。我的第一次嘗試是:

find sessions2 -type f -delete

find sessions2 -type f -print0 | xargs -0 rm -f

但不得不停止,因為兩者都會導致記憶體使用量不斷增加。它一度使用了 65% 的系統記憶體。

所以我認為(毫無疑問是錯誤的),這與系統上啟用了 dir_index 有關。也許 find 正在嘗試將整個索引讀入記憶體?

所以我這樣做了(愚蠢地):tune2fs -O^dir_index /dev/xxx

好吧,這樣應該就可以了。find再次運行上面的命令......同樣的事情。瘋狂的記憶體使用。

我趕緊跑去tune2fs -Odir_index /dev/xxx重新啟用dir_index,結果跑到Server Failure!

2個問題:

1) 如何在我的即時系統上刪除該目錄?我不在乎需要多長時間,只要它使用很少的記憶體和CPU即可。順便說一句,使用nice find ...我能夠減少CPU使用率,所以我現在的問題只是記憶體使用率。

2)我禁用了dir_index大約20分鐘。毫無疑問,新文件同時被寫入文件系統。我重新啟用了 dir_index。這是否意味著系統將找不到在重新啟用 dir_index 之前寫入的文件,因為它們的文件名稱將在舊索引中遺失?如果是這樣,並且我知道這些新文件並不重要,我可以維護舊索引嗎?如果沒有,如何重建索引?可以在即時系統上完成嗎?

謝謝!

答案1

看這個問題:rm 包含數百萬個檔案的目錄

這是我的答案,但還有其他很好的答案:

是否可以將該檔案系統中的所有其他檔案備份到臨時儲存位置,重新格式化分割區,然後還原檔案?

答案2

我傾向於將當前目錄移開,建立一個新目錄,然後刪除舊目錄:

mv 目錄名 目錄名.old; mkdir dirname ls -ld dirname dirname.old # 驗證權限是否正確 rm -rf dirname.old

這樣做的另一個好處是,您不會在歷史記錄中出現可能會意外重新運行的「rm -rf dirname」。 :-)

「rm -rf」應該只使用很少的記憶體開銷來刪除目錄。但是您之前運行的“查找”命令也不應該使用大量開銷記憶體。您如何測量記憶體使用情況?

您不是透過查看“free”命令輸出的“free”列來測量記憶體使用情況的,是嗎?因為 Linux 將使用未使用的記憶體進行磁碟緩存,而「空閒」下的頂部列並未考慮到這一點。您是否看到其中一個程式的記憶體使用情況?哪一個? 「ps awwlx --sort=vsz」將向您顯示使用程式的大內存,並在最後與大內存排序...

答案3

你的問題是你正在將它傳送到 xargs.. 可能會吃掉你所有的內存.. find 有一個刪除選項

find sessions2 -type f -delete

答案4

嗯,一個瘋狂的想法,我不知道它是否可行。如果你嘗試分批進行怎麼辦?首先重命名該目錄並建立一個新的空目錄,這樣新檔案就不會妨礙。然後輸出dir的內容。到一個文字檔。然後檢查該文件並一次刪除 100 個文件,期間休眠並同步?

相關內容