2. 删除巨量文件时用什么命令最快?
话不多说,我们直接上测试。首先借助一个简单的 bash for 循环创建 50 万个文件。
$ for i in $(seq 1 500000); do echo testing >> $i.txt; done
上述命令中,将在当前工作目录中创建 50 万个 txt 文件,名称从 1.txt 到 500000.txt,每个文件都包含 testing
的文本内容,因此文件大小至少在几千字节的范围。在创建了 50 万个文件后,我们将尝试使用多方式来删除它们,看看哪种方式删除巨量文件速度最快。
Round 1:rm 命令
首先让我们使用简单的 rm
命令,同时我们使用 time
命令来计时。
$ time rm -f * -bash: /bin/rm: Argument list too long real 0m11.126s user 0m9.673s sys 0m1.278s
我们可以看到 rm
命令的执行结果是 Argument list too long ,这意味着该命令没有完成删除,因为给 rm
命令的文件数量太大而无法完成,所以它直接就躺平罢工了。不要注意 time
命令显示的时间,因为 rm
命令没有完成它的操作,time
命令只管显示你命令执行了多长时间,而不关心命令的最终结果。
Round 2:使用 -exec 参数的 find 命令
现在让我们使用我们之前看到的带有 -exec 参数的 find
命令。
$ time find ./ -type f -exec rm {} \; real 14m51.735s user 2m24.330s sys 9m48.743s
从我们使用 time
命令得到的输出可以看出,从单个目录中删除 50 万个文件需要 14 分 51 秒。这是相当长的时间,因为对于每个文件,都会执行一个单独的 rm
命令,直到删除所有文件。
Round 3:使用 -delete 参数的 find 命令
现在让我们通过在 find
命令中使用 -delete
选项来测试消耗的时间。
$ time find ./ -type f -delete real 5m11.937s user 0m1.259s sys 0m28.441s
删除速度大大提高,只用了 5 分 11 秒!当你在 Linux 中删除数百万个文件时,这是速度的惊人改进。
Round 4:Perl 语言
现在让我们看看使用 Perl 语言删除文件是如何工作的,以及它与我们之前看到的其他删除方式相比的速度。
$ time perl -e 'for(<*>){((stat)[9]<(unlink))}' real 1m0.488s user 0m7.023s sys 0m27.403s
从结果可以看出,Perl 只用了大约 1 分钟就删除了该目录中的 50 万个文件,与我们之前看到的其他 find
命令和 rm
命令相比,这个速度非常之快!但是,如果您有兴趣在使用 Perl 时用到更复杂的选项,则需要对 Perl 正则表达式有一定的了解。
Round 5:rsync 命令
还有一种较少使用且鲜为人知的方法可用于删除文件夹内的大量文件,这种方法正是我们著名的工具 rsync
,它的基本用法是用于在 Linux 中的两个本地和远程位置之间传输和同步文件。现在我们来看看如何使用 rsync
命令的来删除文件夹内所有文件。其实很简单,我们可以通过将具有大量文件的目标目录与空目录进行同步来实现删除的操作。在我们的例子中, /test
目录(目标目录)有 50 万个文件,我们再创建一个名为 blanktest
的空目录(源目录)。现在,我们将在 rsync
命令中使用 -delete
选项,这将删除目标目录中的所有源目录中不存在文件。
$ time rsync -a --delete blanktest/ test/ real 2m52.502s user 0m2.772s sys 0m32.649s
可以看到,仅用 2 分钟 52 秒就完成删除。因此与 find
命令相比,如果您想清空包含数百万个文件的目录,使用 rsync
命令会更好。
3. 小结
下表总结了 Linux 中采用不同方式删除 50 万个文件的速度,方便大家参考。
命令 | 花费时间 |
rm 命令 | 无法删除大量文件 |
使用 -exec 参数的 find 命令 | 14 分 51 秒 |
使用 -delete 参数的 find 命令 | 5 分 11 秒 |
Perl | 1 分钟 |
rsync 命令 | 2 分 52 秒 |