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


Answers:


33

您可以尝试取消链接目录的索引节点,但这会给您带来大量孤儿文件,这些孤儿文件fsck 翻转出去。

rm 尽其所能。


少数人提到某些情况比其他情况更快的极端情况。但是,请确保我们正在比较相同事物的最佳版本。

如果要删除目录及其中的所有内容,建议您:

rm -rf path/to/directory

rm会在内部列出要删除的文件和目录。而这一切,在编译Ç。这是它最快的两个原因。

很明显,这与rm -rf path/to/directory/*将在shell级别上扩展并将参数传递给的东西不同rm。然后rm必须解析那些,然后从每个递归。那要慢得多。

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

因此要重复一遍,除非您将磁盘放入液态热岩浆中,否则rm为王


值得一提的是,由于文件系统的结构不同,它们以不同的速率删除它们。如果您定期执行此操作,则可能需要将这些文件存储在XFS格式化的分区中,该分区往往可以非常快速地处理删除操作。

或使用更快的磁盘。如果您有大量的RAM,使用/dev/shm(RAM磁盘)可能是一个主意。


您实际上不能unlink在目录上使用系统调用(您会得到一个EISDIR错误),因此第一种选择是不可能的。
James Henstridge 2012年

mv到/ tmp会更快吗?看来,MV也需要很多时间。
Mohammad Moghimi

@MohammadMoghimi:mv在不同的文件系统/分区之间进行ing表示cp后跟一个rm
enzotib 2012年

3
@enzotib但是,如果/tmp在同一文件系统上,我想知道是否mv重新启动会更快?我不确定是否/tmp可以使用清除rm
Sparhawk

1
rsync在这种基准情况下比rm -rfweb.archive.org/web/20130929001850/http
//linuxnote.net/…

11

有时find $DIR_TO_DELETE -type f -delete比快rm -rf

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

最后,如果您需要删除整个分区的内容,最快的可能是umountmkfs然后重新输入mount


1
是不是type -f表示文件而不是目录?同样,添加-print显示正在删除的文件。
leetbacoon

8

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

  • mkdir .delete_me
  • mv我想要的大目录.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-如果您有大型磁盘阵列,这将有所帮助:

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):Ubuntu 18.04附带了ZFS,我将其用于所有功能,并将为任何大型项目创建一个新的数据集。如果您事先计划并事先执行此操作,则可以在完成后简单地“ zfs销毁”文件系统。;-)

我使用来自zfsonlinux Wiki的说明将Ubuntu本地安装到ZFS:https//github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS


2
代替最后一个命令,使用find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf。该-depth选项告诉您find首先列出孩子。
muru

2

我认为问题在于,没有一种完美的方法来删除一个非常大的目录及其整个目录集,而没有一个真正的索引文件系统,该文件系统可以理解取消链接,并不表示它认为文件丢失,例如FSCK。必须有信任。

例如,我有zoneminder在打高尔夫球。我构建了一个1.5 TB的Linux磁盘阵列,以处理她每天捕获的大量数据(12个摄像机供稿),而她如何在120 GB驱动器上运行却超出了我的范围。长话短说,所有捕获数据的文件夹大约占她存储空间的1.4 TB。大量清除

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

真正的索引FS允许删除目录,并且知道目录下的数据已失效,将数据清零会浪费我们的时间和PC资源。应该是将删除的数据归零的选项。RM在ext4上花费了很长时间。

答:递归地断开所有文件的链接速度会稍快一些,但是您仍然需要留出一些时间来运行FSCK。

创建一个运行递归“ FOR”命令的脚本,该脚本可以“取消链接”文件夹下的所有文件,然后仅对所有文件夹进行rm或rmdir清理即可。方便时,手动运行FSCK以将其余数据归零。金达懒惰没有写出来对不起:)。


0

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

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.