使用 rmdir 删除文件夹中的大量空文件夹

使用 rmdir 删除文件夹中的大量空文件夹

我有一个文件夹,其中的文件夹数量在任何时候都不应超过 50 万个。这些文件夹是动态创建的,当其中的文件(图像)被某个脚本删除时,文件夹本身也应被删除。由于出现错误,空文件夹的删除操作没有完成,现在我们有了数百万个空文件夹……

因此,目前我有大约 50 万个包含文件的文件夹,此外还有数百万个空文件夹。

因为其中有太多的目录,即使是简单的 ls | wc -l 也要花几个小时,所以甚至找不到确切的数字。

我可以运行 find 命令:find . -maxdepth 1 -type d -empty; 然后用 rmdir 管道传输它;但同样,find 需要很长时间(甚至不能使用 find 提供的 -delete 选项)

然后我想到使用 rmdir --ignore-fail-on-non-empty /path/to/huge/folder/*; 但我不确定它的效率。基本上,此命令仅删除文件夹中的空目录,这意味着包含文件的目录应该是安全的,不会被删除。然后,“--ignore-fail-on-non-empty”选项会忽略实际上不为空的目录的数十万个警告。

我快速在本地创建了大约 10 万个空文件夹,然后“接触”了其中一些文件,然后使用了 rmdir 命令。虽然创建 10 万个空文件夹花了 2 分钟,但删除空文件夹却花了 2 秒钟(!)。所以我的希望很大,但我不确定它将如何处理大约 1000 万个文件夹......(我想我可以使用 ionice 来阻止系统锁定,以防它真的需要很长时间)

如果有人有任何想法/建议,或者之前遇到过类似的事情,能否请您告诉我解决我的问题的最佳方法。或者告诉我哪种方法更好:find 还是 rmdir...

编辑:我之前忘了提到文件夹结构。主文件夹中包含文件的文件夹不再包含其他文件夹。其他文件夹为空。因此,所有这些数以百万计的文件夹要么是空的,要么包含文件,但没有其他文件夹。因此,树结构中基本上只有一层文件夹。

答案1

如果不知道您有多少个目录,就很难预测哪种方法会如何表现,但我可以告诉您这一点:

find . -maxdepth 1 -type d -empty -delete

非常馊主意。寻找在删除内容时速度非常慢。我对其进行基准测试时,-delete切换速度比最佳方法慢 40 到 50 倍。

同样地,

rmdir --ignore-fail-on-non-empty /path/to/huge/folder/*

应该是次优的。shell 会将 glob 扩展到所有目录条目(文件和文件夹),甚至在将它们传递给删除目录,按字母顺序排列,这会花费时间并且完全没有必要。

综合起来的方法应该是最好的:

find . -maxdepth 1 -type d -empty -exec rmdir {} +

请注意,末尾的加号避免调用删除目录对于每个目录。相反,寻找收集 128 KiB 内尽可能多的目录名称(因为内核对命令行参数有限制)并执行删除目录一次性解决所有问题。

结合以上内容伊奥尼采不会有什么坏处。如果“只有”几百万个目录,我怀疑这样做是没有必要的。但是既然你不知道确切的数字,那就谨慎点吧。

相关内容