【问题标题】:Why is find -delete faster than rm -rf?为什么 find -delete 比 rm -rf 快?
【发布时间】:2016-02-09 20:16:05
【问题描述】:

为什么 find ... -deleterm -rf 快​​这么多?具体来说,

澄清一下:我特意问:为什么find ./x -type d -delete && rm -rf xrm -rf x/ 快这么多?

背景

有一些人使用类似的机制,比如 rsync。

  • 有几篇关于为什么rm -rf 速度慢的帖子。例如,https://unix.stackexchange.com/questions/106133/why-is-rm-slow 可能是最受关注的之一。

  • 具体来说,我发现cd dir-to-delete && find . -type d -delete 后跟rm -rf dir-to-delete 速度非常快,即使在大型目录中也是如此。

【问题讨论】:

  • unix.stackexchange.com 可能是问这个问题的更好地方。
  • 为什么不能更快?它调用unlink() 系统调用而不是启动一个完全不同的程序
  • find 对遍历目录进行了一些优化。特别是它查看链接计数以查看目录是否为空。我不知道rm 是否不包含这些。你可以strace -c ...both 来统计系统调用并看看
  • 您是在单个顶级目录上运行 rm 还是在更大的列表上运行(甚至更糟多次)?
  • 您的“特别”命令 - 目录树中是否有任何文件或只有空目录?

标签: linux rm


【解决方案1】:

rm -f 并不慢,但是如果你运行很多文件并且每个rm 启动一个单独的进程,那么它会很慢,因为在现代处理器上启动一个进程将花费你大约 2 毫秒,如果您改为批量删除,则可以在那时删除许多文件,这就是 find 的-delete 所做的。或者,您可以使用 xargs 批量运行 rm 以达到几乎相同的效果。

【讨论】:

  • “效果差不多”?我们正在谈论整个毫秒以产生 /bin/rm 甚至一次。
  • @CharlesDuffy 如果您可以将数百个文件传递给 rm 调用,那么 2ms 就不算什么。
  • 取决于您的基线。如果是 tmpfs,则 2 毫秒对于大量 unlink()s 来说足够了,这使得性能差异以百分比表示显着。 :)
  • @jayunit100 rm 非常渴望批量删除,但如果你这样做 find ... -exec rm -f {} \; 你只会传递一个文件。您需要find ... -exec rm -f {} +find ... -print0 | xargs -0 rm -f 给它一个批处理,从而最大限度地减少调用次数。
  • 仅供参考 - OP 对问题的编辑使我的答案和可能这个问题不再相关。
猜你喜欢
  • 2012-07-02
  • 2013-01-10
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多