有没有办法缩小目录条目?
我的 dovecot maildir 目录的大小从默认 4096达到几兆,而且会干扰磁盘配额。
我发现的唯一方法是删除并重新创建目录。我希望某个地方有一个神奇的功能——我对任何东西都持开放态度,除了手工编码的汇编程序。
编辑:为了后代,找到 dirents>4096:
find / -type d -size +4k -printf "%s\t%p\t%i\n" | sort -nr
答案1
也可以看看rm 包含数百万个文件的目录(原始问题没有直接关系,但我们仍然在那里讨论了这个问题)。
据我所知,至少在 ext2/3 上,没有,没有(在线)方法可以缩小它们,除非删除 + 重新创建。卸载,一些消息来源建议e2fsck -D
可能有效,尽管我没有使用过此选项的亲身体验。
一些可供进一步阅读的参考资料:
答案2
我会这样做。
cp -al
奥尔迪尔新目录
&& mv
旧目录临时名称
&& mv
新目录旧目录
&& rm -r
临时名称
在哪里旧目录是要收缩的目录 新目录和临时名称是临时文件名
cp -al
创建指向以下内容的链接旧目录在新目录
接下来的三个命令将它们与 newdir 交换并清理。
答案3
最近,我不得不删除并重新创建一个 NFS 目录,以缩小它的大小,因为它之前已经变得臃肿不堪。在此过程中,我发现了一种使用 rsync 和硬链接的相当有效的方法。此方法避免复制实际文件,同时仍可实现重新创建具有相同内容的目录的目标。
由于我们需要在维护时段内停机来执行此操作,因此尽快使重建的目录可用对我们来说非常重要。如果简单性对您来说更重要,请将第一个移动命令更改为源目录上的“rm -rf”,并跳过另一个“rm -rf”命令。
我从一个更大的进程中提取了这些命令,并抽象了目录名称,所以如果我在翻译中犯了错误,请原谅。
mkdir /tmp/holding_dir/
rsync -ai --delete --link-dest=/path/to/source_dir/ /path/to/source_dir/ /tmp/holding_dir/
mv /path/to/source_dir/ /tmp/deleteme/
mv /tmp/holding_dir/ /path/to/source_dir/
然后,我们删除该目录。根据大小,您可能需要使用更复杂的技术来执行此操作。例如,使用带有 --delete 标志的 rsync 将空目录同步到此目录可能会更有效。
rm -rf /tmp/deleteme/