rm命令弱爆了!
大家好,我是良许。
创建、删除和修改文件是用户在 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 秒 | 

rm命令弱爆了!的更多相关文章
- MySQL 的 join 功能弱爆了?
		
大家好,我是历小冰,今天我们来学习和吐槽一下 MySQL 的 Join 功能. 关于MySQL 的 join,大家一定了解过很多它的"轶事趣闻",比如两表 join 要小表驱动大表 ...
 - Linux命令学习总结:rm命令
		
命令简介: 该命令用来删除Linux系统中的文件或目录.通常情况下rm不会删除目录,你必须通过指定参数-r或-R来删除目录.另外rm通常可以将该文件或目录恢复(注意,rm删除文件其实只是将指向数据 ...
 - 【初级】linux rm 命令详解及使用方法实战
		
rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就 ...
 - linux命令(5):rm 命令
		
linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有 ...
 - 改造rm命令为mv
		
:刚在群里面看到小伙伴误操作把服务器上重要的文件给删掉了,于是google了下,找到一篇文章把rm命令改造成mv命令,源博客如下:http://blog.csdn.net/dataspark/arti ...
 - 使用 trash-cli 逃出 rm 命令误删除重要文件的阴影
		
今天是一个难忘的日子,当时本来想清除我们公司网站cms目录下面一些cdn推送网页后残留的垃圾文件,结果在执行rm -rf conten* 时打成了rm -rf conten *结果就悲剧了.cms目录 ...
 - 每天一个 Linux 命令(5):rm 命令
		
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
 - 每天一个linux命令(5):rm 命令
		
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
 - rm 命令(转)
		
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
 
随机推荐
- 洛谷4847 银河英雄传说(LCT+LCSPLAY)
			
QWQ硬是把一个\(splay\)好题,做成了\(LCT\) 首先,根据题目性质,我们可以发现序列之间是具有前后性质的. 那么,我们就不可以进行\(makeroot\)等操作. 我们定义\(findr ...
 - JavaScript表单输入合法控制
			
写在前面 为了提高数据输入的容错性和数据库数据的安全性,除了后端对输入的数据的逻辑判断处理,还可以前端页面高效率处理,从而提高系统的可靠性,下面是这次项目中的自己写的一些符合当时需要的控制. 账号位数 ...
 - 2020.3.14--训练联盟周赛 Preliminaries for Benelux Algorithm Programming Contest 2019
			
1.A题 题意:给定第一行的值表示m列的最大值,第m行的值表示n行的最大值,问是否会行列冲突 思路:挺简单的,不过我在一开始理解题意上用了些时间,按我的理解是输入两组数组,找出每组最大数,若相等则输出 ...
 - 【数据结构】c语言实现集合的交并差运算
			
待改写:存储数据类型int-->char 重复的元素可存储 功能上不完善 #include <stdio.h> #include <stdlib.h> typedef s ...
 - Scrum Meeting 0522
			
零.说明 日期:2021-5-22 任务:简要汇报两日内已完成任务,计划后两日完成任务 备注:由于在Beta冲刺阶段的最后一周中团队成员需要准备必修课程计算机网络的相关考试,所以为了保证Beta功能的 ...
 - spring cloud zuul的回退
			
当我们使用 @EnableZuulProxy 注解来开启zuul的路由时,默认在@EnableZuulProxy注解上就包含了@EnableCircuitBreaker注解,即开启了断路器功能.那么在 ...
 - [NOIP模拟46]鼠树
			
神仙题. 首先不考虑把黑点变白,发现每个白点的信息与它的归属点是相同的.可以在线段树中只维护黑点的信息,再记录$DFS$序上每个点之前黑点个数的前缀和,每次操作可以二分出该点的归属点进行操作. 具体维 ...
 - 设计的MOS管三极管简单开关电路驱动能力不够1
			
您需要 登录 才可以下载或查看,没有帐号?注册 x . ?& P' U5 r/ ~& `: B 用AOD409设计的开关电路为什么驱动能力不够,请大家帮忙分析一下原因啊.这个电路作用就 ...
 - distinct-subsequences leetcode C++
			
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
 - Get_init_color_map
			
#!/bin/bash./simulate_screencap.sh./analysis_screencap.py