rm命令弱爆了!
发布时间:2022-08-09 10:11:49 所属栏目:Linux 来源:互联网
导读:创建、删除和修改文件是用户在 Linux 系统中执行的非常常见操作。大家都知道,在 Linux 系统里使用 rm 命令删除单个文件时,几乎一瞬间就完成了。但是如果文件数量很大,那么删除操作就需要很长时间才能完成。 你有没想过,删除 50 万个小文件,需要花费多少
创建、删除和修改文件是用户在 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 正则表达式有一定的了解。 (编辑:鞍山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |