目录下有980MB元数据,数百万个文件,如何删除? (ext3)

可能重复:
在一个拥有数百万个文件的目录上

你好,

所以我坚持这个目录:

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

但不得不停止,因为两者都造成内存使用率boost。 有一次,它使用了系统内存的65%。

所以我想(毫无疑问是错误的),这是因为在系统上启用了dir_index。 也许发现是试图将整个索引读入内存?

所以我这样做(愚蠢): tune2fs -O^dir_index /dev/xxx

好的,所以应该这样做。 再次运行上面的find命令和…一样的东西。 疯狂的内存使用。

我赶紧跑了tune2fs -Odir_index /dev/xxx重新启用dir_index,并跑到服务器故障!

2个问题:

1)我如何摆脱我的现场系统上的这个目录? 我不在乎需要多长时间,只要它使用less量的内存和小CPU。 顺便说一句,使用nice find ...我能够减lessCPU使用率,所以我现在的问题是只有内存使用情况。

2)我禁用了dir_index约20分钟。 毫无疑问,同时将新的文件写入文件系统。 我重新启用了dir_index。 这是否意味着系统将无法finddir_index重新启用之前写入的文件,因为它们的文件名将从旧索引中丢失? 如果是这样,我知道这些新文件不重要,我可以维护旧的索引? 如果不是,我该如何重build索引? 可以在现场系统上完成吗?

谢谢!

看到这个问题: rm在一个有数以百万计的文件的目录

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

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

你的问题是你是pipe道它xargs ..可能吃了你所有的记忆..find有删除选项

 find sessions2 -type f -delete 

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

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

这还有一个好处,就是您不会在历史logging中以“rm -rf dirname”结尾,您可能会意外地重新运行它。 🙂

“rm -rf”应该只使用很less的内存开销来移除目录。 但是之前运行的“查找”命令也不应该使用大量的开销内存。 你如何衡量内存使用?

你不是通过查看“free”命令输出的“free”列来测量这个内存使用情况,对吗? 由于Linux将使用未使用的内存进行光盘caching,而“免费”下的顶栏不会考虑这一点。 你在其中一个程序中看到了内存使用情况吗? 哪一个? “ps awwlx –sort = vsz”会显示使用程序的大内存,最后以大的内存sorting…

嗯一个疯狂的想法,我不知道这是否会奏效。 如果你尝试分批做呢? 首先重命名目录,并创build一个新的空的,所以新的文件不妨碍。 然后输出目录的内容。 到一个文本文件。 然后浏览该文件并一次删除100个文件,并在两者之间进行hibernate和同步?