Linux

如何修復曾經有數千個文件但現在只有很少的目錄但對於“ls”和“find”仍然很慢的目錄?

  • December 4, 2021

我有一個目錄,我允許該motion實用程序載入 jpeg 文件,直到磁碟已滿。然後我閱讀了“有效地刪除包含數千個文件的大目錄”並獲得了刪除 jpeg 文件的想法,並清理了目錄。在此之後,查看該目錄的文件名仍然非常緩慢,即使現在文件的數量約為 10 或 20。

問題是,如何使這個目錄便於再次使用?

你不能,反正不是在 ext4 上。

ext4 永遠不會縮小目錄的大小(即,目錄本身的大小,而不是其內容的大小)一旦增長。AFAIK,這在幾個(大多數?)其他 fs 類型上都是如此,但不是所有 fs 類型。這會嚴重影響某些目錄中包含數千或數百萬個文件的文件系統的性能,即使這些文件已被刪除或移動。

順便說一句,一旦目錄中包含大量文件,並非所有文件系統都會遇到嚴重的性能問題(IIRC,這在 xfs 上不是問題,並且在 ext4 上的問題比在 ext3 或 ext2 上的問題要小)。

解決方案是將內容移動到具有相同名稱的新目錄。例如:

mv dir dir.old
mkdir dir
chmod --reference=dir.old/ dir/
chown --reference=dir.old/ dir/
mv dir.old/* dir/
rmdir dir.old

並確保新目錄與舊目錄具有chmod完全相同所有者、組和權限。如果您使用 ACL,您也必須複製它們。chown

注意:如果目錄實際上是文件系統的掛載點,這將不起作用。AFAIK,縮小文件系統頂級目錄的唯一方法是備份,使用 mkfs 重新格式化和恢復。

**更新:**用於關閉此問題的第二個重複連結表示您可以umount使用 fs 並使用e2fsck -C0 -f -D /dev/XXX. 有關man e2fsck這些選項的作用的詳細資訊,請參閱。

另請注意:無論是使用mv、backup-reformat-restore 還是fsck,您都應該在目錄和其中的文件未被任何程序使用時執行此操作。停止使用目錄中文件的任何程序。如有必要,重新啟動到單使用者/緊急模式。

引用自:https://unix.stackexchange.com/questions/680106