如何对 ext3 上的目录进行“碎片整理”?

Bad*_*ada 5 filesystems directory ext3

我正在运行一个守护进程,它分析目录中的文件,然后删除它们。如果守护进程由于某种原因没有运行,文件就会堆积在那里。今天该目录中有 90k 个文件。再次启动守护进程后,它处理了所有文件。

然而,目录仍然很大;“ls-dh”。返回大小为 5.6M。我如何对该目录进行“碎片整理”?我已经发现重命名该目录并创建一个具有相同名称和权限的新目录可以解决问题。然而,由于文件随时写入其中,似乎没有一种安全的方法来重命名目录并创建新目录,因为目标目录暂时不存在。

那么 a) 有没有一种方法/一个(shell)程序可以对 ext3 文件系统上的目录进行碎片整理?或者 b) 有没有办法在目录上创建锁,以便尝试写入文件会阻塞,直到重命名/创建完成为止?

Kei*_*ith 0

我不知道有什么方法可以从目录中回收可用空间。

5MB 的空间并不是很大,因此最简单的方法就是忽略它。如果此问题(文件在目录中堆积)定期发生,则只要目录再次填满,该空间就会被重复使用。

如果您迫切需要缩小目录的能力,这里有一个(丑陋的)黑客可能会起作用。

将目录替换为空目录的符号链接。如果此问题再次出现,您可以创建一个新的空目录,然后更改符号链接以指向新目录。更改符号链接应该是原子的,这样您就不会丢失任何传入的文件。然后您可以安全地清空并删除旧目录。

[编辑添加:事实证明这不起作用。正如 Bada 在评论中指出的那样,您不能按照我建议的方式自动更改符号链接。这让我保留了原来的观点。我熟悉的文件系统不提供回收目录块中可用空间的机制。]