如何修复曾经有数千个文件但现在很少但“ls”和“find”仍然很慢的目录?

如何修复曾经有数千个文件但现在很少但“ls”和“find”仍然很慢的目录?

我有一个目录,允许motion实用程序加载 jpeg 文件,直到磁盘已满。然后我读了“有效删除包含数千个文件的大目录”并得到了删除jpeg文件的想法,并清理了目录。此后,查看该目录的文件名仍然非常缓慢,尽管现在文件数量约为 10 或 20。

问题是,如何让这个目录再次方便使用?

答案1

你不能,无论如何不能在 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确保chown新目录已确切地与旧版本相同的所有者、组和权限。如果您使用 ACL,则还必须复制它们。

注意:如果目录实际上是文件系统的挂载点,则这将不起作用。 AFAIK,缩小文件系统顶级目录的唯一方法是备份、使用 mkfs 重新格式化并恢复。

更新:用于关闭此问题的第二个重复链接表示您可以umountfs 并使用e2fsck -C0 -f -D /dev/XXX.man e2fsck有关这些选项的作用的详细信息,请参阅 参考资料。

另请注意:无论是使用mv、 backup-reformat-restore 还是fsck,您都应该在目录及其中的文件未被任何进程使用时执行此操作。停止使用目录中文件的任何进程。如有必要,重新启动至单用户/紧急模式。

答案2

如果您使用的是 SSD,则应该修剪它。$ fstrim -vvv -a如果是硬盘的话,我无法想象会发生什么!

相关内容