有没有比“rm -rf”更快的方法来删除目录?

我有一个包含许多文件的文件夹,“rm -rf”需要很长时间才能完成。 有没有更快的方法来删除目录及其内容(子目录等)?

您可以尝试取消链接目录的inode,但这会让您获得fsck 将要翻开的大量孤立文件。

rm和它一样好。


有些人提到边缘情况,有些东西比其他东西快。 但是,让我们确保我们比较相同事物的最佳版本。

如果你想删除一个目录及其中的所有内容,我建议你:

 rm -rf path/to/directory 

rm将在内部列出要删除的文件和目录。 这都是在编译的C中 。 这是最快的两个原因。

这与rm -rf path/to/directory/* ,它将在shell级别扩展并将rm参数传递给rm 。 然后rm必须解析那些,然后从每个recurse。 那要慢得多。

就像一个“基准”比较find path/to/directory -exec {} \; 是胡说八道。 它发现每个文件运行一次rm 。 太慢了。 使用-exec rm {} +查找xargs样式的构建命令参数,但这与扩展一样慢。 你可以调用-delete ,它使用对内核的内部unlink调用(比如rm ),但是这只适用于文件。

所以重复一遍,除非你将磁盘扔进液体热的岩浆中,否则rm是王道


在相关的说明中,由于结构的不同,不同的文件系统会以不同的速率删除内容。 如果您定期执行此操作,则可能需要将这些文件存储在以XFS格式化的分区中,这样可以非常快速地处理删除操作。

或者使用更快的磁盘。 如果你有大量的RAM,使用/dev/shm (一个RAM磁盘)可能是一个想法。

有时, find $DIR_TO_DELETE -type f -deleterm -rf快。

您可能还想尝试mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE

最后,如果您需要删除整个分区的内容,最快的可能是umountmkfs和re- mount

如果您不需要可用空间,最快的方法是延迟删除并在后台执行此操作:

  • mkdir .delete_me
  • mv big-directory-that-want-gone-gone .delete_me

然后有一个crontab在后台执行它,在安静的时间,具有低I / O优势:

 3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" + 

笔记:

  • 在删除crontab中的回显之前检查输出!
  • .delete_me目录必须位于同一个文件系统中 – 以防每个人都不明白。

更新:我找到了一个并行运行多个rm的巧妙技巧 – 如果你有一个大磁盘arrays,这将有所帮助:

 ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf 
  • -depth做深度优先遍历。

  • -maxdepth来限制目录遍历的深度,因此我们不会最终监听单个文件。

  • -d \ n用于处理文件名中的空格。

  • -P和-n处理并行度(检查手册页)。

参考: http : //blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

更新2(2018):随着ZFS随Ubuntu 18.04一起提供,我将它用于所有内容 ,我将为任何大项目创建一个新的数据集 。 如果您提前计划并事先执行此操作,则可以在完成后简单地“zfs destroy”文件系统。 😉

我使用zfsonlinux wiki中的指令将Ubuntu本地安装到ZFS: https : //github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS

我认为问题在于没有完美的方法来删除一个非常大的目录及其整个内容集,而没有真正的索引归档系统,它理解取消链接,并不意味着它认为它缺少文件ala FSCK。 必须要有信任。

例如,我有一个跑步高尔夫球场的区域。 我构建了一个1.5 TB的linux raid来处理她每天捕获的大量数据(12个摄像头源),她在120 GB驱动器上的运行方式超出了我的范围。 长话短说,所有捕获数据的文件夹大约是她的存储空间的1.4 TB。 有很多要清除

必须重新安装ZM并清除1.4 TB旧库并不好玩,因为删除旧图像可能需要1-2天。

真正的索引FS允许丢弃目录并知道其下的数据已经死亡,并且将数据清零是浪费我们的时间和PC资源。 应该可以选择将已删除的数据归零。 RM只需要在现实世界中使用ext4。

答案:递归取消链接所有文件的速度会稍微快一点,但你仍然需要留出时间来运行FSCK。

创建一个运行递归“FOR”命令的脚本,该命令可以“取消链接”文件夹下的所有文件,然后只需rm或rmdir所有文件夹进行清理。 当方便时,手动运行FSCK以将其余数据清零。 有点懒,没有把它写出来抱歉:)。

虽然如果你想要清除一个现有的目录,但是没有用,我会提到一个可能的策略,如果你知道你将有一个目录,其中包含你需要定期清除的文件,就是把目录放在自己的文件系统上( 例如 ,分区)。 然后,当您需要清除它时,卸载它,运行mkfs并重新安装它。 例如, OpenBSD建议为/usr/obj执行此操作 ,其中许多文件是在系统构建期间创建的,并且必须在下一次构建之前删除。