关于java:rm命令弱爆了

40次阅读

共计 2984 个字符,预计需要花费 8 分钟才能阅读完成。

大家好,我是良许。

创立、删除和批改文件是用户在 Linux 零碎中执行的十分常见操作。大家都晓得,在 Linux 零碎里应用 rm 命令删除单个文件时,简直一瞬间就实现了。然而如果文件数量很大,那么删除操作就须要很长时间能力实现。

你有没想过,删除 50 万个小文件,须要破费多少工夫?

我写这篇文章的目标,是为了找出在 Linux 中删除巨量文件的最快办法。通过测试发现,rm 命令几乎弱爆了!

咱们将从一些简略的文件删除办法开始,而后比拟不同办法实现文件删除工作的速度。看看哪种形式删除速度最快。

1. 文件删除的几种形式

在 Linux 零碎中删除文件,最罕用的命令就是 rm 命令。这个命令置信大家都曾经很相熟了,咱们来简略回顾一些 rm 命令的例子。

$ rm -f testfile

-f 选项在下面的命令中,示意将在不要求确认的状况下强行删除文件。

$ rm -rf testdirectory

这个命令将删除名为 testdirectory 的目录以及该目录中的所有内容(应用的 -r 选项是递归删除文件)。

而删除目录,咱们还有另一个命令,那就是 rmdir,然而它只有在目录为空时才会删除该目录。

$ rmdir testdirectory

当初咱们看看在 Linux 中删除文件的一些其它不同办法。

我最喜爱的办法之一是应用 find 命令,再进行删除操作。find 命令是一个十分不便的工具,可用于依据文件的类型、大小、创立日期、批改日期和更多不同的条件来搜寻文件。

咱们来看一个 find 命令应用 -exec 来调用 rm 命令的例子。

$ find /test -type f -exec rm {} \;

上述命令将删除 /test 目录中的所有文件。首先 find 命令将查找目录中的所有文件,而后对于每个搜寻后果,它会执行 rm 命令。

咱们再看看能够与 find 命令一起应用的一些不同办法来删除文件。

$ find /test -mtime +7 -exec rm {} \;

在上述示例中,find 命令将搜寻 /test 目录中 7 天前批改过的所有文件,而后删除每个文件。

$ find /test -size +7M -exec rm {} \;

上述示例中,将搜寻目录 /test 目录中所有大于 7M 的文件,而后再删除它们。

在以上咱们列出来的所有 find 命令示例中,都会为找到的每个文件调用 rm 命令。例如,在下面的最初一个 find 命令中,如果后果中有 50 个大于 7M 的文件,那么将调用 50 次 rm 命令删除文件。而这样的操作将须要破费更长的工夫。

除了在 find 中借助 -exec 参数调用 rm 命令外,还有一个更好的抉择,那就是应用 -delete 选项。比方:

$ find /test -size +7M -delete

达到的成果与上一条命令一样。

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 秒


最初,最近很多小伙伴找我要 Linux 学习路线图 ,于是我依据本人的教训,利用业余时间熬夜肝了一个月,整顿了一份电子书。无论你是面试还是自我晋升,置信都会对你有帮忙!

收费送给大家,只求大家金指给我点个赞!

电子书 | Linux 开发学习路线图

也心愿有小伙伴能退出我,把这份电子书做得更完满!

有播种?心愿老铁们来个三连击,给更多的人看到这篇文章

举荐浏览:

  • 干货 | 程序员进阶架构师必备资源免费送
  • 书单 | 程序员必读经典书单(高清 PDF 版)

欢送关注我的博客:良许 Linux 教程网,满满都是干货!

正文完
 0