如何快速删除包含许多子文件夹的文件夹?


15

我有一个包含266778个子文件夹的文件夹。如何删除?

我试过了

cd ~/.local/share/Trash/
sudo rm -rf *

但是要花很多时间 经过1分25秒的实时和0.072秒的用户时间后,它仅删除了2500个文件夹。这样,将需要两个多小时才能删除此文件夹。

是否有删除此文件夹的更快方法?为什么用户时间和实时之间有如此大的差异?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

我使用Linux 2.6.32(Ubuntu 10.04.4 LTS)。


我刚刚用谷歌搜索了这个问题,似乎有人发现rsync可以非常有效地用作“许多文件删除”工具。它是否真正更快取决于您的评估。
2013年

2
这样做的价值:删除许多文件夹/文件时的性能高度依赖于文件系统。以我的经验,在ext3(缓慢)与XFS(快速)上删除数百万个小文件时的区别可能是数小时。
pdo

如果您经常遇到这种情况,并且可以使用btrfs之类的文件系统并使用子卷进行提前计划,则可以通过转储该子卷来加快处理速度。
PlasmaHH '16

在这里您可以找到答案。perl是最快的。 unix.stackexchange.com/questions/37329/...
SDsolar

Answers:


17

如果您的“ find”版本实现了-delete子命令,则可以尝试

find directory -delete

在这种情况下:

find ~/.local/share/Trash/ -delete

某些命令(例如rm)在内核中执行其大部分工作。确切地说,在文件系统例程中。用这种方法可以解决执行系统调用所花费的时间,因此,尽管您的“ rm”命令运行了很长时间,但它在用户区域的工作并不多-系统调用完成了大部分工作。


+1; 虽然这也会删除父目录,但我怀疑OP仅想删除垃圾箱文件夹的内容,而不是文件夹本身
don_crissti 2013年

1
@don_crissti:很好的评论。如果 OP仅想删除〜/ .local / share / Trash下的子目录(而不是第一级文件),则:(find ~/.local/share/Trash/*/ -delete 当然,这也会删除那些Trash / * /中的文件(和目录)以及subdirs)
Olivier Dulac

2
+1解释了time
马丁·托马

3
find directory -delete真的比快rm -rf directory?毕竟,他们执行相同的工作,并且没有两种方法可以完成它。
吉尔(Gilles)'所以

1
@Johan找到的真的很快。您是否有机会找出原因?
Harshdeep

20

这取决于您对fast的定义。此处已经存在的答案为从文件系统中实际删除目录提供了一个很好的解决方案,但是如果您真正需要的是尽快释放目录名称,则可以在同一文件系统上立即重命名:

{ mv directory directory.gone && rm -rf directory.gone; } &

从技术上讲,这是骗人的,因为我还没有加快实际的删除速度,但实际上它非常有用:我一直都在使用此技巧,因此不必等待缓慢的删除操作。


大。您一直以来都在做什么用例?如果您经常这样做,是否没有积压,获得多个“ directory.gone”而失败的危险?我认为您使用的后缀是'$$'或'%(date ...)'
smci

1
如果需要,可以将mktemp与参数一起使用,以确保它保留在同一文件系统上。但是我不能说我现在有一个具体的例子。
kojiro

kojiro是的,谢谢,mktemp这就是我想要记住的...
smci

1

rm -rf directory或者rm -rf *,当然是最快的方法,除非你的本地rm执行被打破。

使用find没有优势。

这是快还是慢主要取决于文件系统和OS的实现。因此,这个问题似乎是不合适的。

众所周知,Solaris上的UFS和ZFS可以非常快地完成这种任务,因为这两个文件系统实现都包含延迟的后台删除代码,即使相关对象总共需要花费更多时间,该代码也会导致unlink()and rmdir()调用快速返回。

通过内核中延迟的后台删除,目录更新也可以快速完成,这有助于加快整个操作。


虽然可以原谅这个想法,但这实际上是不正确的,正如这个答案所描述的那样。
Hitechcomputergeek

0

这只是部分答案,可以说明命令返回的三个值。引用自time(1)

(ⅰ)调用和终止之间经过的真实时间,(ii)所述用户CPU时间(的总和的tms_utimetms_cutime值在struct tms由返回times(2)),和(iii)该系统的CPU时间(的总和的tms_stimetms_cstime值在struct tmstimes(2))返回。”

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.