如何快速删除包含大量子文件夹的文件夹?

如何快速删除包含大量子文件夹的文件夹?

我有一个包含 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)。

答案1

这取决于你的定义快速地。这里已经提供了一个很好的解决方案,用于实际从文件系统中删除目录,但如果您真正需要的是释放目录姓名尽可能快地,同一文件系统上的重命名是即时的:

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

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

答案2

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

find directory -delete

在这种情况下:

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

有些命令(例如 rm)在内核中执行大部分工作。确切地说,在文件系统例程中。执行系统调用所花费的时间就是以这种方式计算的,因此虽然您的“rm”命令运行了很长时间,但它在用户态中并没有做太多工作 - 系统调用执行了大部分工作。

答案3

rm -rf directory或者rm -rf *当然是最快的方法,除非您的本地rm实现被破坏。

使用find没有任何优势。

快还是慢主要取决于文件系统和操作系统的实现。所以这个问题似乎不太合适。

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

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

答案4

如果您不想等待,并且想避免停机,或者您只需要快速删除该文件夹,请mv在下次重新启动时将删除操作排队。此外,mv文件操作总是比其他任何操作都快,并且无需等待阻塞文件 io 操作,并继续您当前在该文件夹上执行的操作。

只是mv folder_to_be_deleted /tmp/folder_queue_for_deletion。 /tmp 目录中的文件将在下次重新启动时删除。

基准:

$ cat make_million_files.sh
#!/usr/bin/env bash

mkdir folder_to_be_deleted
for i in $(seq 0 1000000); do
  touch folder_to_be_deleted/$i;
done
$ ./make_million_files.sh
real    66m3.613s
user    5m47.507s
sys     61m15.432s

IO阻塞操作

$ rm -rf folder_to_be_deleted
real    0m32.451s
user    0m2.086s
sys     0m25.094s

非 IO 阻塞操作(下次重新启动时删除队列)

$ mv folder_to_be_deleted /tmp/folder_queue_for_deletion
real    0m0.012s
user    0m0.001s
sys     0m0.010s

从本质上讲,如果您有多个包含大量子文件夹的文件夹,并且您希望快速删除它们,而不需要停机,那么好处是显而易见的,您可以考虑此解决方案,因为删除一百万个包含大量子文件夹的文件夹只需要 60 秒。子文件夹。

对于包含大量子文件夹的 1000 个文件夹,使用 阻塞 IO 大约需要 1 小时rm -rf,而使用 则需要 12 秒mv。只需 60 秒的启动时间即可删除所有内容。最后,如果您不想重新启动,只需mv将该文件夹移开,并将rm -rf其放在某个位置(其他 TTY 会话等)即可。

相关内容