当前位置: 首页 > 后端技术 > Java

rm命令很弱!

时间:2023-04-01 20:38:51 Java

大家好,我是良旭。创建、删除和修改文件是用户在Linux系统中执行的非常常见的操作。大家都知道,在Linux系统中使用rm命令删除单个文件时,几乎是瞬间完成的。但是如果文件数量很大,那么删除操作将需要很长时间才能完成。您是否想过删除50万个小文件需要多长时间?我写这篇文章的目的是找出在Linux中删除大文件的最快方法。通过测试发现rm命令简直弱爆了!我们将从一些简单的文件删除方法入手,然后比较不同方法完成文件删除任务的速度。看看哪种删除方式最快。一、删除文件的几种方法在Linux系统中删除文件,最常用的命令就是rm命令。这个命令相信大家都不陌生。让我们简要回顾一下rm命令的一些示例。$rm-ftestfile上面命令中的-f选项表示文件将被强制删除而不要求确认。$rm-rftestdirectory此命令将删除名为testdirectory的目录以及该目录中的所有内容(使用的-r选项是递归删除文件)。要删除一个目录,我们有另一个命令,它是rmdir,但它只会删除目录,如果它是空的。$rmdirtestdirectory现在让我们看看在Linux中删除文件的其他一些不同方法。我最喜欢的方法之一是使用查找命令,然后执行删除操作。find命令是一个非常方便的工具,可用于根据文件的类型、大小、创建日期、修改日期和更多不同的标准搜索文件。让我们看一个示例,其中find命令使用-exec调用rm命令。$find/test-typef-execrm{}\;上面的命令会删除/test目录下的所有文件。首先find命令会查找目录中的所有文件,然后对于每个搜索结果,它会执行rm命令。让我们再看看使用find命令删除文件的一些不同方法。$find/test-mtime+7-execrm{}\;在上面的示例中,find命令将搜索/test目录中超过7天前修改过的所有文件,并删除每个文件。$find/test-size+7M-execrm{}\;在上面的例子中,会搜索目录/test目录下所有大于7M的文件,然后删除。在我们上面列出的所有find命令示例中,为找到的每个文件调用rm命令。比如上面最后一个find命令,如果结果中有50个大于7M的文件,那么rm命令会被调用50次来移除文件。而这样的操作将需要更长的时间。除了在find中调用带有-exec参数的rm命令,还有一个更好的选择,那就是使用-delete选项。例如:$find/test-size+7M-delete与前面命令的效果相同。2、删除大文件用什么命令最快?话不多说,我们直接进入测试。首先借助简单的bashfor循环创建500,000个文件。$foriin$(seq1500000);做回声测试>>$i.txt;done上面的命令会在当前工作目录下创建500,000个txt文件,文件名从1.txt到500000.txt,每个文件包含测试的文本内容,所以文件大小至少在这个范围内几千字节。创建500,000个文件后,我们将尝试使用多种方法删除它们,看看哪种方法删除大文件最快。第一轮:rm命令首先让我们使用简单的rm命令,同时我们使用time命令进行计时。$timerm-f*-bash:/bin/rm:Argumentlisttoolongreal0m11.126suser0m9.673ssys0m1.278s我们可以看到rm命令的执行结果是Argumentlisttoolong,也就是说该命令有没有完成删除,因为给rm命令的文件数量太大,无法完成,所以干脆平躺敲击。不要注意time命令显示的时间,因为rm命令还没有完成它的操作。time命令只显示你的命令执行了多长时间,并不关心命令的最终结果。第2轮:带有-exec参数的find命令现在让我们使用我们之前看到的带有-exec参数的find命令。$timefind./-typef-execrm{}\;real14m51.735suser2m24.330ssys9m48.743s从我们使用time命令得到的输出中,我们可以看到从单个文件中删除500,000个文件需要14分钟目录51第二。这是相当长的时间,因为对于每个文件,都会执行一个单独的rm命令,直到所有文件都被删除。第3轮:使用-delete参数查找命令现在让我们通过在find命令中使用-delete选项来测试经过的时间。$timefind./-typef-deletereal5m11.937suser0m1.259ssys0m28.441s删除速度更快,只用了5分11秒!当您在Linux中删除数百万个文件时,这是一个惊人的速度提升。第4轮:Perl语言现在让我们看看Perl语言的文件删除是如何工作的,以及它与我们之前见过的其他删除方法相比有多快。$timeperl-e'for(<*>){((stat)[9]<(unlink))}'real1m0.488suser0m7.023ssys0m27.403s从结果可以看出,Perl只用了大约1一分钟就删除了该目录中的500,000个文件,与我们之前看到的其他find和rm命令相比,这相当快!但是,如果您在使用Perl时对更复杂的选项感兴趣,则需要熟悉Perl正则表达式。第五轮:rsync命令还有一个鲜为人知的删除文件夹中大量文件的方法。这个方法正是我们著名的工具rsync,它基本上是用来在本地和远程之间传输和同步文件的。现在让我们看看如何使用rsync命令删除文件夹中的所有文件。其实很简单,我们可以通过同步目标目录下有大量文件的空目录来实现删除操作。在我们的例子中,/test目录(目标目录)有500,000个文件,我们创建另一个名为blanktest的空目录(源目录)。现在,我们将在rsync命令中使用-delete选项,这将删除目标目录中源目录中不存在的所有文件。$timersync-a--deleteblanktest/test/real2m52.502suser0m2.772ssys0m32.649s可以看到只用了2分52秒就完成了删除。所以如果你想清空一个有数百万个文件的目录,rsync命令比find命令更好。3.总结下表总结了Linux下不同方式删除50万个文件的速度,供大家参考。命令需要时间。rm命令不能删除大量文件。使用-exec参数的find命令耗时14分51秒。使用-delete参数的查找命令耗时5分11秒。Perl命令需要1分钟,而rsync命令需要2分52秒。最后,最近很多朋友找我学习Linux。路线图,于是根据自己的经验,利用业余时间熬夜一个月,整理出一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员进阶架构师必备资源免费书单|程序员必读经典书籍清单(高清PDF版))欢迎关注我的博客:良序Linux教程网,干货满满!