rm刷新了我的认知

2023-11-01

大家好,我是良许。

创建、删除和修改文件是用户在 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开发学习路线图

也希望有小伙伴能加入我,把这份电子书做得更完美!

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rm刷新了我的认知 的相关文章

  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • Capistrano 3 部署无法连接到 GitHub - 权限被拒绝(公钥)

    我使用 Capistrano v3 和 capistrano symfony gem 设置了以下部署脚本 我正在使用 Ubuntu 14 4 部署到 AWS EC2 实例 我正在连接从 AWS 下载的 pem 文件 我的deploy rb中
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏

随机推荐

  • 随机生成图形验证码

    引入此js内容 function window document var size 4 设置验证码长度 function GVerify options 创建一个图形验证码对象 接收options对象为参数 this options 默认o
  • 服务器管理系统是什么

    服务器管理系统是什么 服务器管理系统 是在操作系统下对操作系统的服务器软件及其相关软件进行二次设置的管理软件 是运营商管理域名 服务器 企业邮局 数据库等服务器主机类产品的一个网站平台 以达到快捷实现域名 服务器主机 企业邮局 数据库等产品
  • 引入旧的Java项目的时候出现"Description Resource Path Location Type Date cannot be resolved to "解决方案

    错误描述 Description Resource Path Location Type Date cannot be resolved to a type add jsp besto WebRoot WEB INF pages serie
  • 策略模式和工厂模式的区别_工厂模式和策略模式

    学习最好的方法还是得通过笔记和代码 所以今天继续学习工厂模式和策略模式 简单工厂模式 工厂模式很多人比较熟悉 之前很多地方都能看到工厂模式 之前一直以为工厂模式很简单 所以就没有认真的去学习这个模式 没有去了解这个模式的精髓 今天就好好学习
  • Fiddler抓包教程

    参考资料 Fiddler抓包1 抓firefox上https请求 1 抓firefox上https请求 前言 fiddler是一个很好的抓包工具 默认是抓http请求的 对于pc上的https请求 会提示网页不安全 这时候需要在浏览器上安装
  • 全网最全网络安全(黑客)自学路线!

    一 前言 1 这是一条坚持的道路 三分钟的热情可以放弃往下看了 2 多练多想 不要离开了教程什么都不会了 最好看完教程自己独立完成技术方面的开发 3 有时多 google baidu 我们往往都遇不到好心的大神 谁会无聊天天给你做解答 4
  • C语言共用体详解

    文章目录 共用体解释 代码说明 小端存储 Little Endian 共用体与小端存储 为什么只能用第一个成员类型的值初始化一个共用体变量 共用体解释 共用体 Union 是一种特殊的数据类型 它允许在同一个内存位置存储不同的数据类型 共用
  • undefined reference to `OsqpEigen::Solver::lu_solve()‘问题解决

    记录使用OSQPEigen和QuadProgpp遇到的bug 问题描述 编译工程报错 usr lib gcc cross aarch64 linux gnu 9 aarch64 linux gnu bin ld libcontrol so
  • M.2/sata2.0/3.0接口,PCI-E1.0/2.0/3.0/4.0x2x4x8x16速率汇总

    B站 硬件科普 PCIe到底是个什么东西 他在电脑里是干什么的 PCIE2 0 PCIE3 0 PCIE4 0 PCIE5 0接口的带宽 速率计算 sata2和sata3接口区别 https diy pconline com cn grap
  • 比较器

    比较器 比较器 顾名思义 做比较的 比较两个电压 然后输出高低电平 01 不带反相的比较器 当Vin gt Vref 输出高电平 当Vin
  • float浮动布局大战position定位布局

    华子目录 布局方式 普通文档流布局 浮动布局 浮动主要针对与black inline元素 float属性 浮动用途 浮动元素父级高度塌陷 position属性定位篇 相对定位 relative为属性值 配合left属性 和top属性使用 绝
  • SparkStreaming写入hbase数据库过程中,有空指针NullPointException产生如何处理以及RDD类型如何转换!!

    所用的软件版本 spark2 3 0 hbase1 4 6 IDEA2019 1 业务代码如下 package com bd spark import org apache kafka clients consumer ConsumerRe
  • 自定义CMD命令

    1 首先我们要创建一个自定义命令名 bat文件 例如 music bat 2 写入需要执行的命令 保存退出 例如 软件所在的绝对路径 3 键入win R 输入sysdm cpl 4 打开高级 gt 环境变量 gt 系统变量 gt Path
  • python的inspect模块

    http www cnblogs com walkerwang archive 2011 08 03 2125903 html 简介 发现python有个好用的检查模块 inspect 查看源文件发现它提供了不少好用的方法 Here are
  • Proteus中的继电器在哪里

    今天做仿真时候 用到了继电器 但是电路搭建好后发现怎么继电器上电不动作 发现是继电器选错了 然后找了一个最常用的继电器来用一试成功 所以就分享一下Proteus中的继电器在哪里 如图所示 我们先点一下第一步的元器件标志 然后在点一下旁边的标
  • 第三方软件测试环境搭建步骤流程

    在软件测试流程及各项环节中 不可避免的要进行测试环境的搭建 测试环境与开发环境不一样 比如说你要对APP进行功能测试或者性能测试 那就要模拟用户在使用APP时候的真实场景 客户会进行什么样的操作 所以测试环境需要尽可能的贴近真实环境进行 那
  • 智能优化与机器学习结合算法实现数据预测matlab代码清单

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • pandas中drop()函数用法

    函数定义 DataFrame drop labels None axis 0 index None columns None inplace False 删除单个行 import pandas as pd import numpy as n
  • 硬件第一节 三级管电路工作原理及详解

    文章目录 一 三极管辨认 1 1 辨认bce边 1 2 三极管工作状态 1 2 1放大状态 1 2 2 截止状态 1 2 3 饱和状态 二 三极管使用 2 1 三极管作为开关管 三 三极管选型 3 1 参数 3 2 常用三极管参数整理 一
  • rm刷新了我的认知

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