我正在运行一个守护程序来分析目录中的文件,然后删除它们。如果守护程序由于某种原因未运行,则文件会堆叠在那里。今天我在该目录中有90k文件。再次启动守护程序后,它处理了所有文件。
但是,目录仍然很大; “ls -dh。”返回5.6M的大小。我怎样才能“整理”该目录?我已经发现重命名该目录,并创建一个具有相同名称和权限的新目录解决了这个问题。但是,随着文件随时写入文件,似乎没有一种安全的方法来重命名目录并创建一个新目录,目标目录不存在。
那么a)是否有一种方法/一个(shell)程序可以对ext3文件系统上的目录进行碎片整理?或者b)有没有办法在目录上创建一个锁,以便尝试写文件阻塞,直到重命名/创建完成?
答案 0 :(得分:1)
“优化文件系统中的目录。此选项使e2fsck尝试优化所有目录,如果文件系统支持目录索引,则通过重新索引它们,或者使用传统线性目录对文件系统进行排序和压缩。” - fsck.ext3 -D
当然,这不应该在挂载的文件系统上完成。
答案 1 :(得分:1)
不适用于Ext3,但可能对其他文件系统的用户有用:
根据https://wiki.archlinux.org/index.php/Btrfs#Defragmentation, Btrfs 显然可以对目录的元数据进行碎片整理:btrfs filesystem defragment /
将对根文件夹的元数据进行碎片整理。这使用了Btrfs的在线碎片整理支持。
虽然 Ext4 支持在线碎片整理(使用e4defrag
),但这似乎不适用于目录元数据(根据http://sourceforge.net/p/e2fsprogs/bugs/326/)。
但我没有尝试过这两种解决方案。
答案 2 :(得分:0)
我不知道从目录中回收可用空间的方法。
5MB的空间不是很大,所以忽略它可能是最容易的。如果这个问题(文件堆叠在目录中)定期发生,那么只要目录再次填满,该空间就会被重用。
如果您迫切需要缩小目录的能力,这可能会起作用(丑陋)黑客攻击。
将目录替换为指向空目录的符号链接。如果再次出现此问题,则可以创建新的空目录,然后将符号链接更改为指向新目录。更改符号链接应该是原子的,因此您不会丢失任何传入的文件。然后,您可以安全地清空并删除旧目录。
[编辑补充:事实证明这不起作用。正如Bada在评论中指出的那样,你不能以我建议的方式原子地改变符号链接。这让我得到了原点。我熟悉的文件系统不提供回收目录块中可用空间的机制。]