我有一个包含 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 会话等)即可。