我有一个文件夹,该文件夹在任何时候都应少于500k文件夹。这些文件夹是动态创建的,并且当其中的文件(图像)被某些脚本删除时,该文件夹本身也应删除。由于存在错误,没有删除空文件夹,现在我们有了数百万个空文件夹...
因此,目前我大约有500k文件夹,其中包含文件,此外还有数百万个空文件夹。
因为那里有很多目录,甚至是简单的ls | wc -l需要几个小时,因此甚至无法找到确切的数字。
我可以运行find命令:find。-maxdepth 1 -d型-空; 然后用rmdir用管道传递它;但同样,查找需要花费一定的时间(甚至使用查找要约的-delete选项)
然后我想到了使用rmdir --ignore-fail-on-non-empty / path / to / huge / folder / *; 但是我不确定它的效率。基本上,此命令仅删除我文件夹中的空目录,这意味着具有文件的目录应该是安全的,不能删除。然后,“-ignore-fail-on-non-empty”选项会忽略成千上万的警告或警告,这些警告实际上并不为空。
我很快在本地创建了约10万个空文件夹,然后“触摸”其中的一些文件,然后使用rmdir命令。创建100k空文件夹花了2分钟,而删除空文件夹花了2秒(!)。因此,我寄予厚望,但我不确定它将如何处理大约1000万个文件夹...(我想我可以使用ionice来阻止系统锁定,以防它真的需要很长时间。)
如果任何人有任何想法/建议,或者以前曾遇到过类似的事情,请您为我指出解决问题的最佳方法。甚至告诉我哪种方法更好:find或rmdir ...
编辑:我忘了提到文件夹结构。主文件夹中包含文件的文件夹,其中不再有文件夹。其他文件夹为空。因此,所有数百万个文件夹要么为空,要么其中包含文件,但没有更多文件夹。因此,基本上树结构中只有一层文件夹。
在不真正知道您有多少目录的情况下,很难预测哪种方法的行为,但是我可以告诉您:
find . -maxdepth 1 -type d -empty -delete
是一个非常糟糕的主意。在删除内容时,find的速度非常慢。在我进行基准测试的时间里,-delete
切换速度比最佳方法慢40到50倍。
同样地,
rmdir --ignore-fail-on-non-empty /path/to/huge/folder/*
应该是次优的。Shell会将glob扩展到所有目录条目(文件和文件夹),并且甚至在将它们传递到rmdir之前,都按字母顺序对其进行排序,这将花费时间并且完全没有必要。
组合方法应该是最好的:
find . -maxdepth 1 -type d -empty -exec rmdir {} +
请注意,末尾的加号可避免为每个目录调用rmdir。相反,find会收集128 KiB中可以容纳的尽可能多的目录名称(由于命令行参数的内核限制),并一次对所有目录执行rmdir。
将以上内容与ionice结合使用不会造成伤害。如果“只有”几百万个目录,我怀疑是否有必要。但是由于您不知道确切的号码,因此比后悔更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句