快速删除Linux目录树


6
rm -rf mydir

对于reiserfs文件系统上具有100000个文件(在子目录中)的目录树,速度非常慢。

有什么想法可以更快地删除目录树(甚至冒着罕见的损坏风险)?


未经测试,但您可以尝试find mydir -delete将其删除。find经过高度优化-可能比更快rm -rf
Johannes Schaub-litb

随着时间更新:rm -rf实时获取0m18.688s,而find -delete实时获取1m38.126s。我猜rm胜了:)尽管我事后进行了rm测试-我不知道这是否重要?(这是一个精确的副本,在创建树后我重新启动了该框)。用户和SYS时间是有趣:rmuser 0m0.130s sys 0m11.913s,而find花了user 0m0.057s sys 0m0.597s。层次结构大约有7000个文件,并且有许多目录由深度2组成(文件位于子目录中)。
Johannes Schaub-litb

Answers:


4

我能想到的唯一解决方案是将所有文件放在单独的文件系统上。文件系统可以驻留在磁盘分区或文件中。

除了删除文件,您还可以擦除分区或删除文件。

我可以向您表示同情,因为我在NTFS上有超过20万个文件的项目,删除树确实很麻烦。如果可以的话,我会

  • 使用另一个文件系统(在您的情况下,reiserfs对于IIRC来说,有很多文件是相当不错的)
  • 避免拥有太多文件(例如,使用数据库)

这正是人们在Gentoo上所做的事情,因为程序包管理器具有许多可以读写的小文件。只需将/ usr / portage放在单独的文件系统dd上,如果= / dev / zero of = / opt / portagefile bs = 1k seek = 1024k count = 1; mkfs.reiserfs -f / opt / portageFile gentoo-wiki.info/TIP_Speeding_up_portage#Why_It_Works
2012年

2

在目录中拥有不计其数的文件几乎总是一个坏主意。但这总是发生在我身上。旧文件系统变得不可用,因为删除文件的数量为O(n)。我认为当前的Linux文件系统都不会那样糟。(对ReiserFS并不乐观,但如果真的如此,我会感到惊讶)。但是,即使有了一个好的文件系统,shell工具在删除文件时仍会执行过多的工作。他们在陈述文件,显式测试权限,创建大型命令行等。

一种解决方法是只调用unlink()系统调用来进行非常低级的删除。这是一些简单易用的Python,当rm使我失败时,它允许我删除一百万个文件:

files = os.listdir('.')
for f in files:
  try: os.unlink(f)
  except Exception, e: print e

正是rm -rf所做的,调用了unlink。rm只是取消链接的同义词。Python不会比C快。rm如何使您失败?应该有什么区别?
j13r 2012年

1

XFS确实可以更快地删除。ext {2,3,4}是最糟糕的,我不知道reiserfs在它们之间的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.