【Linux】聊聊删文件的那些破事

news/2024/5/1 11:09:23/文章来源:https://blog.csdn.net/Meepoljd/article/details/126967071

聊聊删文件的那些破事

  • 前言
  • 正文
    • rm命令
    • find命令
    • perl方式
      • 10w文件删除对比
      • 50w文件删除对比
      • 100w文件删除对比
  • 结语

前言

在操作系统的日常运维中,我们经常会做文件的创建、删除、修改操作,尤其是删除,无论是定期清理日志文件,还是做完一个操作以后删除临时文件,这都是非常常见的操作,如果你运维的服务器是非常小型的,而且业务量并不多,那也许你永远不会遇到在文件删除时产生的性能问题;但是如果你需要运维临时文件产生巨多或者日志产生巨多或者其他会产生大量文件的服务器,你也许会遇到删除文件时的瓶颈问题,其中最常见的就是/bin/rm: Argument list too long;如果还没有遇到,可以随便找一个目录,创建一个测试文件夹,并生成随机的文件,然后尝试rm所有文件:

mkdir file_test
cd file_test
for i in $(seq 1 500000); do echo testing >> $i.txt; done
rm -rf *

相信很快你就会遇到上述的问题,从这个问题出发,我们聊聊删除文件的这些破事。

正文

在Linux中,虽然不同的文件系统在数据删除上的具体实现有所不同,但均是对inode进行操作,更改文件的元数据信息,就和HDFS一样,你能否找到数据取决于NameNode里有没有存对应块的元数据信息。

找到几个博文解释ext各文件系统的数据删除原理,放在这里,感兴趣可以看看:
ext4文件系统文件删除解析
ext2和ext3文件系统文件删除解析

rm命令

rm命令虽然是最常用的用来删除文件的命令,但是正如我上文所说,当文件数过多的时候就会无法执行,这种情况下,常见的方式是通过一些关键字做文件的筛选删除,尽量保证每批删除的文件数量在rm允许的范围内,比如按照文件所带的日期或者按照字母开头来筛选:

rm -rf *20220921*
rm -rf a*

当然,在报错/bin/rm: Argument list too long的时候,删除操作是没有进行的,所以无论执行多少次,文件都没被删除。

find命令

当通过一些关键字做筛选无法满足我们的运维要求时,就要寻求别的方式了,比如文件名没有明显的特征,或者需要按照文件的生成日期进行删除等场景,大部分人会使用类似以下的命令进行删除:

find $path -mtime +3 -name "*" -type f -exec rm -rf {} \;

原先我也使用这个命令去做文件删除,但是耗时非常久,这是因为find结合rm -rf命令的原理是对于所有搜索出来满足条件的文件,都执行一次rm -rf命令。

一个更好的替代方式是以下的命令格式:

find $path -mtime +3 -name "*" -type f -delete

以下是两种方式删除相似体量的文件耗时的对比:
在这里插入图片描述
在这里插入图片描述

能够看出来明显的区别,所以下次再使用find删除文件的时候还是尽量使用delete,性能能够提升很多;

当然,如果你能用rm来实现的时候,还是用rm会好一些:
在这里插入图片描述

perl方式

除了上述两种方式,还有一种使用很少的方式,那就是用perl脚本来做文件删除,从我的测试来看,之所以知道这个也是因为之前看到网上的大佬说perl的性能比find delete还要高,但是在我的测试下并不是这样,性能最好的还是find delete,以下是删除10w个文件和50w个文件的性能对比:

10w文件删除对比

perl方式
在这里插入图片描述
find delete方式
在这里插入图片描述

50w文件删除对比

perl方式
在这里插入图片描述
find delete方式

在这里插入图片描述

100w文件删除对比

perl方式
在这里插入图片描述
find delete方式
在这里插入图片描述
当然了,在进行筛选的情况下我没有实际做过测试,我估计在极大数据量的情况下,性能差距不会太大的,如果有朋友有兴趣测试可以继续下去,并给我留言,附上我的清理脚本,这个脚本会在给定目录下再遍历一层进行数据删除:

#!/usr/bin/perluse File::Find;
use File::Spec;my $path="/home/test";opendir DH, $path or die "cannot chdir to $path : $!";for my $p (readdir DH) {next if $file eq "." or $file eq "..";my $sonpath=File::Spec->catdir($path,$p);opendir SH, $sonpath or die "cannot chdir to $sonpath : $!";for my $file (readdir SH) {next if $file eq "." or $file eq "..";next if $file =~ /^\./;my $abspath=File::Spec->catdir($sonpath,$file);my @s=stat("$abspath");if ((time()-$s[8]) > (60*60*24*2)){print "delete file $abspath\n";unlink $abspath;}}closedir SH;
}
closedir DH;

结语

一直以来都只是简单的使用rm命令做数据删除,这次因为业务上的需要,参与到大量文件的清理工作中,想要找到在linux下最高效的数据清理方式,也正是在这些目标的驱动下,了解到更多的文件清理方法,希望在以后的不断学习中能够探索到更高效的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11450.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传统光流方法汇总

又搬运了一个3d视觉相关的~~ 还是先道歉 就是学习用 还是公交上回家看那种 ~~ 这次分享传统光流方法汇总及其在深度学习中的应用!(基于相位/能量/匹配/变分) 回望传统光流估计方法 近年来,随着深度学习技术的快速发展&#xff…

嵌入式分享合集63

一、PCB为什么一定要做阻抗 在具有电阻、电感和电容的电路里,对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示,是一个复数,实部称为电阻,虚部称为电抗。 其中电容在电路中对交流电所起的阻碍作用称为容抗,电感在电路…

Pr:多机位编辑

很多时候一个机位满足不了影视创作的需求。比如拍摄人物动作,如果能使远景、近景、特写等一些镜头相互衔接,将会使得角色显得更加丰富饱满。不同的景别传达着不同的信息,更容易交待环境和表达角色的情绪。早期人们在拍摄的同时完成多机位切换…

应用层 HTTP 代理服务器转发消息时的相关头部 请求头 X-Forwarded-For

在http消息传递过程当中会经过很多正向代理服务器和反向代理服务器,这些代理服务器在转发消息的时候会涉及到http的头部,下面将会介绍这些头部,包括由于存在这些代理服务器所以客户端和源服务器之前有许多的tcp连接,有一些http头部…

Flutter快学快用15 服务通信:Flutter 中常见的网络协议

上一课时之前,我们的接口都是在代码中模拟假数据,并没有从服务端获取数据,但是在实际开发中,必须与服务端进行交互。本课时主要介绍在 Flutter 中常见的网络传输协议序列化方式,并对其中比较常用的协议进行简单实践&am…

大数据培训技术phoenix表操作

phoenix表操作 1 显示所有表 !table 或 !tables 2 创建表 CREATE TABLE IF NOT EXISTS us_population ( State CHAR(2) NOT NULL, City VARCHAR NOT NULL, Population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city)); 如下显示: 在p…

超级基础篇_疑惑实验

1、多态: 多态是什么? 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作多态的优点 1.消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 …

树的应用 —— 二叉树:二叉树的性质

树的应用 —— 二叉树 二叉树(Binary Tree)是n (n ≥0)个节点构成的集合,或为空树(n 0),或为非空树。 对于非空树T ,要满足: ①有且仅有一个被称为根的节点…

FFmpeg入门详解之20:视频编码原理简介

视频为何需要压缩? 原因:未经压缩的数字视频的数据量巨大 ● 存储困难 ○ 一G只能存储几秒钟的未压缩数字视频。 ● 传输困难 ○ 1兆的带宽传输一秒的数字电视视频需要大约4分钟。 主要压缩了什么东西? 原始视频压缩的目的是去除冗余信息&a…

结构体的理解

结构体前言结构体?定义变量如何赋初值?结构体的访问结构体的嵌套使用注意事项结构体的大小内存对齐默认对齐数的修改为什么存在内存对齐?结构体传参位段什么是位段?位段的内存分配深入剖析位段“存”数据位段的“取”位段的跨平台…

Idea工具中,使用Mapper对象有红线

背景: IDEA开发工具,springboot mybatis项目 (这个是不需要改的,也不算是问题,因为项目并不会报错,只是作者好奇找了下问题,并记录一下) 问题描述 mapper对象在service层有红线&a…

8 位卷王!总结 1135 页 Java 核心面试手册,硬钢 BATJ 一线大厂面试官

又到了金九银十求职季! HR 开始拼业绩,招聘网站也开始释放出大量岗位,转行跳槽、毕业求职的人都开始行动起来! 此时,对于大多数程序员来说,最大的目标就是:进大厂! 大厂为什么这么…

ArcGIS Map Sdk for unity使用

本文主要讨论离线模式。 目录 1.底图tpk文件制作 2.3D图层slpk文件制作 3.导入使用 1.底图tpk文件制作 软件:91卫图助手 Arcgis Pro 操作步骤: 打开91卫图助手,更换底图为高德影像/腾讯影像。(百度影像的地理投影格式有自身加密&#xff…

剖析容器运行时

特别说明:一部分转载自大佬文章:https://blog.csdn.net/weixin_39246554/article/details/120926174(不得不说大佬总结的真好啊!!!) 剩下的听老王公开课总结。 k8s官网关于运行时的说明&#x…

Typora Mac版本安装Pandoc导出文件为word格式(windows可通用)

我们在用Typora时导出的格式常常为PDF格式,但是如果我们要将文件导出为word格式的时候却需要安装插件PanDoc,我目前使用的是Mac版本的Typora,给大家分享一下如何安装Pandoc以及导出word格式文件。 1.根据Typora中的说明进入GitHub下载Pandoc…

Maven安装配置

Maven安装配置一、下载 apache-maven-3.6.1Maven官网:https://maven.apache.org/download.cgi(或)直接下载maven-3.8.6:https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip解压到当前文件夹二、配置 maven 环境变量右键此电脑 - 属性 - 高级…

MySQL学习——执行计划

MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的,这将有利我们做代码的优化。 1、MySQL查询执行过程客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,若缓存中存在,则立刻返回存储在缓存中的结果。否则进入下一阶段 服务…

扫码挪车小程序源码专业版上线了

1 、做挪车码之前,先说一些我个人的观点,大家一起探讨学习交流。 2 、挪车码已经是普遍已久的项目,其核心主要在于解决了车主的隐私问题。 3 、观察过目前市面上所有的挪车码系统, 公司也购买了一套测试了完整流程,盈…

【图像分割】基于matlab萤火虫算法图像分割【含Matlab源码 2136期】

一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【图像分割】基于matlab萤火虫算法图像分割【含Matlab源码 2136期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏图像处理(Matlab) 备注: 点击上面蓝色字体付费专栏图像处理(Matlab),…

parted分区步骤

parted分区步骤概述 通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大;而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘。但是现在的磁盘空间很多都已经是远远大于2T了,甚至达到2.5T和3T,那要怎么办能,有两…