可能重复:
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
答案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 个文件,其间休眠并同步?