rm命令弱爆了!



大家好,我是良许。

创建、删除和修改文件是用户在 Linux 系统中执行的非常常见操作。大家都知道,在 Linux 系统里使用 rm 命令删除单个文件时,几乎一瞬间就完成了。但是如果文件数量很大,那么删除操作就需要很长时间才能完成。

你有没想过,删除 50 万个小文件,需要花费多少时间?

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

我们将从一些简单的文件删除方法入手,然后比较不同方法完成文件删除任务的速度。查看删除哪种方法最快。

[En]

We will start with some simple file deletion methods, and then compare the speed of different methods to complete the file deletion task. See which method is the fastest to delete.

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

效果与上一条命令相同。

[En]

The effect is the same as the previous command.

2. 删除巨量文件时用什么命令最快?

不多说了,让我们直接去考试吧。

[En]

Without saying much, let’s go straight to the test.

首先借助一个简单的 bash for 循环创建 50 万个文件。

$ for i in $(seq 1 500000); do echo testing >> $i.txt; done

上述命令中,将在当前工作目录中创建 50 万个 txt 文件,名称从 1.txt 到 500000.txt,每个文件都包含 testing 的文本内容,因此文件大小至少在几千字节的范围。

在创建了 50 万个文件后,我们将尝试使用多方式来删除它们,看看哪种方式删除巨量文件速度最快。

rm命令弱爆了!

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 < code></(unlink))}'></*>

从结果可以看出,Perl 只用了大约 1 分钟就删除了该目录中的 50 万个文件,与我们之前看到的其他 find 命令和 rm 命令相比,这个速度非常之快!

但是,如果您有兴趣在使用 Perl 时用到更复杂的选项,则需要对 Perl 正则表达式有一定的了解。

rm命令弱爆了!

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 秒

rm命令弱爆了!

Original: https://www.cnblogs.com/yychuyu/p/15594899.html
Author: 良许Linux
Title: rm命令弱爆了!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524331/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 轻量级多级菜单控制框架程序(C语言)

    1、前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计;很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网…

    Linux 2023年6月7日
    045
  • Xshell小技巧

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月14日
    0170
  • windows or linux 64位安装ta-lib包

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月13日
    0306
  • batch批处理笔记

    1. echo 和 @ 回显命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显。一般批处理第一行都是这个 echo on …

    Linux 2023年6月7日
    039
  • 聊聊消息中心的设计与实现逻辑

    厌烦被消息打扰,又怕突然间的安静; 一、业务背景 微服务的架构体系中,会存在很多基础服务,提供一些大部分服务都可能需要的能力,比如文件管理、MQ队列、缓存机制、消息中心等等,这些服…

    Linux 2023年6月14日
    038
  • 购买服务器与域名利用tomcat快速搭建个人网站

    基于Linux环境下的个人网站搭建 一.下载工具 二.购买云服务器 三.安装配置服务器软件 配置环境变量 四.购买域名并设置域名解析 五.上传网站文件 一.下载工具 远程主机:1….

    Linux 2023年6月7日
    048
  • 网站URL如何SEO优化

    前言 本文讲解网站的URL如何进行SEO优化,并在自己的WordPress博客echeverra中优化URL。 起因 对于SEO我了解的并不多,只知道SEO做的好,那么各大搜索网站…

    Linux 2023年6月7日
    037
  • 15.Git面试题

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月30日
    0208
  • 理想汽车 x JuiceFS:从 Hadoop 到云原生的演进与思考

    理想汽车在 Hadoop 时代的技术架构 首先简单回顾下大数据技术的发展,基于我个人的理解,将大数据的发展分了4个时期: 第一个时期: 2006 年到 2008 年。2008 年左…

    Linux 2023年6月14日
    029
  • linux的启动流程详解

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年10月19日
    0175
  • Kubernetes 容器平台实战

    一、什么是Kubernetes? Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署,自动扩缩容,维护等功能. 通过Kubernetes可以做到…

    Linux 2023年6月14日
    038
  • 常用的分布式锁和redis和zk两种分布式锁的对比

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月14日
    0145
  • Linux安装jdk

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    037
  • 在自己的项目中使用PCL

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月10日
    0156
  • shell脚本

    1、什么是shell 什么是shell ? Shell(外壳) 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。 Shell 既是一种命令语言, 又是一种程序设计语…

    Linux 2023年5月27日
    043
  • Shell脚本完成IOS平台下的多目录和多架构编译(调用Makefile一起完成)

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cy568searchx/p/5735429.htmlA…

    Linux 2023年5月28日
    046
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球