Linux 递归删除大量的文件
一般情况下
在 Ubuntu 中,递归删除大量文件和文件夹可以通过以下几种方式快速完成。常用的方法是使用 rm
命令,配合一些适当的选项来提高删除速度和效率。
1. 使用 rm
命令递归删除
最常见的方式是使用 rm
命令的递归选项 -r
来删除目录及其所有内容。
rm -rf /path/to/directory
-r
:递归删除目录中的所有文件和子目录。-f
:强制删除,即使文件是只读的或不提示确认。
2. 提高删除速度的技巧
在某些情况下,使用 rm
删除大量文件可能比较慢。以下是一些加速删除的技巧:
a. 避免磁盘写入同步 (sync
)
在删除大量文件时,系统会自动进行磁盘写入同步操作,这可能会影响速度。你可以在删除文件之前临时关闭文件系统的写入同步:
sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
这将确保系统缓存中的数据写入磁盘,并清空文件系统缓存。虽然不会直接加速删除过程,但可以减少潜在的I/O延迟。
b. 调整 I/O 调度器(高级)
你可以尝试临时更改文件系统的 I/O 调度器,例如将调度器改为 noop
或 deadline
,这样可以加速文件删除操作。不过,这通常适用于 SSD。
echo noop | sudo tee /sys/block/sdX/queue/scheduler
将 sdX
替换为你的硬盘设备。
c. 并行删除
可以使用 find
命令结合 xargs
来并行化删除过程,充分利用多核 CPU。这种方法可以显著加快删除速度。
find /path/to/directory -type f -print0 | xargs -0 -P 8 rm -f
-type f
:只查找文件。-print0
:防止文件名中的特殊字符(如空格)造成问题。xargs -0 -P 8
:并行删除,-P 8
表示使用 8 个线程并行执行删除操作。
同样,你也可以递归删除子目录:
find /path/to/directory -type d -empty -delete
3. 使用 rsync
快速清空目录
虽然 rsync
通常用于文件同步,但你可以利用它来快速删除目录中的所有文件。这里我们使用 rsync
将一个空目录同步到目标目录,从而清空该目录:
mkdir /tmp/empty && rsync -a --delete /tmp/empty/ /path/to/directory/
这会递归删除 /path/to/directory/
中的所有文件和子目录。
4. 使用 ionice
降低系统负载
在删除大量文件时,系统 I/O 可能会变得非常繁忙,影响系统的响应速度。你可以使用 ionice
来降低删除过程对系统其他进程的影响:
ionice -c 3 rm -rf /path/to/directory
-c 3
:设置rm
命令为最低的 I/O 优先级,确保系统其他操作不会受到影响。
5. 注意事项
- 小心使用
rm -rf
:这是一条非常危险的命令,误用可能导致重要数据丢失。请确保删除的目录路径正确无误。 - 备份重要文件:在进行大规模删除之前,建议备份重要数据。
- 磁盘性能:如果你使用的是机械硬盘 (HDD),删除大量文件的速度可能较慢。对于 SSD,速度会快得多。
通过上述方法,可以有效地加快递归删除大量文件和文件夹的速度,尤其是使用 find
和 xargs
进行并行删除时,性能提升显著。
对于机械硬盘
在机械硬盘 (HDD) 上使用多线程进行删除操作 通常不适用,而且可能不会带来明显的性能提升,甚至可能导致性能下降。这是由于机械硬盘的物理特性决定的。
原因
-
机械硬盘的寻道时间:
- 机械硬盘的瓶颈在于它的 寻道时间(磁头定位到正确的扇区所需的时间)。多线程删除会导致多个线程同时试图删除不同区域的文件,这会迫使磁头频繁在不同位置间移动,增加了寻道的次数,从而减慢删除速度。
-
顺序读取/写入 vs. 随机读取/写入:
- 机械硬盘的顺序读取和写入性能明显高于随机操作。单线程删除文件时,磁头通常可以顺序地遍历目录并删除文件,效率较高。而多线程删除会导致多个线程竞争 I/O 资源,硬盘磁头频繁地在不同位置来回移动,导致随机 I/O 操作增多,降低了效率。
-
多线程 I/O 争用:
- 在 HDD 上并行删除文件,会使多个线程同时发起 I/O 请求。这些并行的 I/O 请求会相互争用硬盘资源,反而会进一步加剧机械硬盘的负载,降低操作效率。
机械硬盘上删除文件的优化策略
虽然多线程删除不适用于机械硬盘,但你可以通过以下方式优化删除操作:
-
使用单线程删除:
- 在机械硬盘上,单线程删除通常效率更高,因为它能够让磁头顺序移动,减少寻道时间。直接使用
rm -rf
或find
命令来逐步删除文件是最稳妥的选择。
示例:
rm -rf /path/to/directory
或
find /path/to/directory -type f -delete
- 在机械硬盘上,单线程删除通常效率更高,因为它能够让磁头顺序移动,减少寻道时间。直接使用
-
分批删除:
- 如果要删除的文件数量非常大,可以通过分批删除减少系统资源占用。比如,使用
find
命令结合xargs
,删除指定数量的文件(如每次 1000 个):
find /path/to/directory -type f | head -n 1000 | xargs rm
- 如果要删除的文件数量非常大,可以通过分批删除减少系统资源占用。比如,使用
-
减少 I/O 优先级:
- 为了避免删除操作对其他系统操作产生影响,可以使用
ionice
降低删除进程的 I/O 优先级:
ionice -c 3 rm -rf /path/to/directory
这样可以让删除操作在后台更平稳地进行,而不会对前台的其他操作造成太大的影响。
- 为了避免删除操作对其他系统操作产生影响,可以使用
-
使用
nocache
选项:- 在删除大量文件时,可以使用
nocache
选项避免文件系统缓存被大量文件操作占用。
rm -rf --nocache /path/to/directory
- 在删除大量文件时,可以使用
SSD 上的多线程删除
相比之下,多线程删除更适用于 SSD,因为 SSD 没有机械磁头和寻道时间问题。SSD 在处理并行 I/O 时表现得更好,多个线程同时进行删除操作不会显著增加延迟。因此,如果你使用的是 SSD,可以考虑使用多线程删除来加速操作。
相关文章:
Linux 递归删除大量的文件
一般情况下 在 Ubuntu 中,递归删除大量文件和文件夹可以通过以下几种方式快速完成。常用的方法是使用 rm 命令,配合一些适当的选项来提高删除速度和效率。 1. 使用 rm 命令递归删除 最常见的方式是使用 rm 命令的递归选项 -r 来删除目录及其所有内容。…...

设计一个算法,找出由str1和str2所指向两个链表共同后缀的起始位置
假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间,例如,’loading’和’being’的存储映像如下图所示。 设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为 data…...
Python中如何判断一个变量是否为None
在Python中,判断一个变量是否为None是一个常见的需求,特别是在处理可选值、默认值或者是在函数返回结果可能不存在时。虽然这个操作本身相对简单,但围绕它的讨论可以扩展到Python的哲学、类型系统、以及如何在不同场景下优雅地处理None值。 …...

表观遗传系列1:DNA 甲基化以及组蛋白修饰
1. 表观遗传 表观遗传信息很多为化学修饰,包括 DNA 甲基化以及组蛋白修饰,即DNA或蛋白可以通过化学修饰添加附加信息。 DNA位于染色质(可视为微环境)中,并不是裸露的,因此DNA分子研究需要跟所处环境结合起…...
Android 跳转至各大应用商店应用详情页
测试通过机型品牌: 华为、小米、红米、OPPO、一加、Realme、VIVO、IQOO、荣耀、魅族、三星 import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import …...
Pywinauto鼠标操作指南
Pywinauto是一个强大的Python库,用于自动化Windows桌面应用程序的测试。它提供了一系列工具和API来模拟用户输入,包括键盘、鼠标事件,以及与各种窗口控件交互的能力。本文将详细介绍如何使用Pywinauto来执行鼠标操作,并通过一些示…...

VRAY云渲染动画怎么都是图片?
动画实际上是由一系列连续的静态图像(帧)组成的,当这些帧快速连续播放时,就形成了动画效果。每一帧都是一个单独的图片,需要单独渲染。 云渲染农场的工作方式: 1、用户将3D场景文件和动画设置上传到云渲染…...
共享内存(C语言)
目录 一、引言 二、共享内存概述 1.什么是共享内存 2.共享内存的优势 三、共享内存的实现 1.创建共享内存 2.关联共享内存 3.访问共享内存 4.解除共享内存关联 5.删除共享内存 四、共享内存应用实例 五、总结 本文将深入探讨C语言中的共享内存技术,介绍其原理、…...

《JavaEE进阶》----16.<Mybatis简介、操作步骤、相关配置>
本篇博客讲记录: 1.回顾MySQL的JDBC操作 2..Mybatis简介、Mybatis操作数据库的步骤 3.Mybatis 相关日志的配置(日志的配置、驼峰自动转换的配置) 前言 之前学习应用分层时我们知道Web应用程序一般分为三层,Controller、Service、D…...

HuggingFists算子能力扩展-PythonScript
HuggingFists作为一个低代码平台,很多朋友会关心如何扩展平台算子能力。扩展平台尚不支持的算子功能。本文就介绍一种通过脚本算子扩展算子能力的解决方案。 HuggingFists支持Python和Javascript两种脚语言的算子。两种语言的使用方式相同,使用者可以任选…...
WInform记录的添加和显示
1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace ComboBoxApp {public part…...

★ C++基础篇 ★ string类的实现
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C基础篇第五章下篇----string类的模拟实现 ~ 上篇:★ C基础篇 ★ string类-CSDN博客 C基础篇专栏:★ C基础篇 ★_椎名澄嵐的博客-CSDN博客 目录 一 基础结构 二 迭代器 …...
rman compress
级别 初始 备完 耗时 low 1804 3572 0:10 High 1812 3176 2:00 MEDIUM 1820 3288 0:13 BASIC 1828 3444 0:56 ---不如MEDIUM,时间还长 NO COMPRESS 1820 5924 0:5 R…...
创建一个Oracle版本的JDK的Docker镜像
背景说明 OpenJDK 和Oracle JDK 一般情况下我们选择OpenJDK,两者针对大部分场景都可以满足,有些地方例如反射技术获得某些包路径下的类对象等,有时候选择OpenJDK会导致空指针异常。 两者在底层实现方面有部分区别。 创建镜像 这里是Linux…...

Harmony OS DevEco Studio 如何导入第三方库(以lottie为例)?-- HarmonyOS自学2
在做鸿蒙开发时,离不开第三方库的引入 一.有哪些支持的Harmony OS的 第三方库? 第三方库下载地址: 1 tpc_resource: 三方组件资源汇总 2 OpenHarmony三方库中心仓 二. 如何加入到DevEco Studio工程 以 lottie为例 OpenHarmony-TPC/lot…...

JAVA数据导出为Excel
目录 一、导入依赖 二、使用的相关类 1、XSSFWorkbook 构造方法 创建表 操作表 保存表 样式和格式 日期处理 密码保护 其他 2、XSSFSheet 获取属性和信息 行操作 列操作 表的属性 合并单元格 保护表 页眉和页脚 注释 其它 3、XSSFRow 获取属性和信息 单…...

【数据结构与算法 | 灵神题单 | 快慢指针(链表)篇】力扣876, 2095, 234
1. 力扣876:链表的中间节点 1.1 题目: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,…...

第十五届蓝桥杯图形化省赛题目及解析
第十五届蓝桥杯图形化省赛题目及解析 一. 单选题 1. 运行以下程序,角色会说( )? A、29 B、31 C、33 D、35 正确答案:C 答案解析: 重复执行直到m>n不成立,即重复执行直到m<n。所有当m小于或者 等于n时&…...
linux下NTP服务器实战(chrony软件)
linux下NTP服务器实战(chrony软件) 记录linux下NTP服务器搭建及相关管理操作,使用chrony软件包安装部署。相比ntp服务,Chrony服务适用于更高精度、更高稳定性、自动化等场景。 1. 安装 chrony 在大多数Linux发行版上,chrony可以通过包管理…...

Java设计模式之命令模式介绍和案例示范
一、命令模式简介 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为一个对象,从而使你可以用不同的请求对客户端进行参数化、对请求排队或记录日志,以及支持可撤销的操作。命令模式的核心思想是将发出请…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案
文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下,数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统,还是初创…...

Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...

【Elasticsearch基础】Elasticsearch批量操作(Bulk API)深度解析与实践指南
目录 1 Bulk API概述 1.1 什么是批量操作 1.2 Bulk API的优势 2 Bulk API的工作原理 2.1 请求处理流程 2.2 底层机制 3 Bulk API的使用方法 3.1 基本请求格式 3.2 操作类型示例 3.3 响应格式 4 Bulk API的最佳实践 4.1 批量大小优化 4.2 错误处理策略 4.3 性能调…...