目录包含 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 Fault!

2个问题:

1) 我如何在实时系统上删除此目录?我不在乎需要多长时间,只要它占用很少的内存和 CPU 即可。顺便说一句,使用nice find ...我可以减少 CPU 使用率,所以我现在的问题只是内存使用率。

2) 我禁用了 dir_index 大约 20 分钟。毫无疑问,在此期间,新文件被写入了文件系统。我重新启用了 dir_index。这是否意味着系统将找不到在重新启用 dir_index 之前写入的文件,因为它们的文件名将在旧索引中丢失?如果是这样,而且我知道这些新文件并不重要,我可以保留旧索引吗?如果不行,我该如何重建索引?可以在实时系统上完成吗?

谢谢!

答案1

请参阅这个问题:rm 包含数百万个文件的目录

这是我的答案,但也有其他很棒的答案:

是否可以将该文件系统中的所有其他文件备份到临时存储位置,重新格式化分区,然后恢复文件?

答案2

我倾向于将当前目录移开,创建一个新目录,然后删除旧目录:

mv dirname dirname.old; mkdir dirname ls -ld dirname dirname.old # 验证权限是否正确 rm -rf dirname.old

这样做还有一个好处,那就是您不会在历史记录中出现可能意外重新运行的“rm -rf dirname”。:-)

“rm -rf” 应该会使用很少的内存开销来删除目录。但是您之前运行的“find”命令也不应该使用大量内存开销。您如何测量内存使用情况?

您不会通过查看“free”命令输出的“free”列来测量此内存使用情况,对吗?因为 Linux 将使用未使用的内存进行磁盘缓存,而“free”下的顶部列不会考虑这一点。您是否看到其中一个程序中的内存使用情况?哪一个?“ps awwlx --sort=vsz”将向您显示使用大量内存的程序,并将大程序排在最后……

答案3

您的问题是您正在将其传输到 xargs。可能会占用那里的所有内存。find 有一个删除选项

find sessions2 -type f -delete

答案4

嗯,这是一个疯狂的想法,我不知道它是否会奏效。如果你尝试批量执行,会怎么样?首先重命名目录并创建一个新的空目录,这样新文件就不会妨碍。然后将目录的内容输出到文本文件。然后浏览该文件并一次删除 100 个文件,其间休眠并同步?

相关内容