Linux 递归删除大量的文件

devtools/2024/9/20 7:12:59/ 标签: 数据库

一般情况下

在 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 调度器,例如将调度器改为 noopdeadline,这样可以加速文件删除操作。不过,这通常适用于 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,速度会快得多。

通过上述方法,可以有效地加快递归删除大量文件和文件夹的速度,尤其是使用 findxargs 进行并行删除时,性能提升显著。

对于机械硬盘

在机械硬盘 (HDD) 上使用多线程进行删除操作 通常不适用,而且可能不会带来明显的性能提升,甚至可能导致性能下降。这是由于机械硬盘的物理特性决定的。

原因

  1. 机械硬盘的寻道时间

    • 机械硬盘的瓶颈在于它的 寻道时间(磁头定位到正确的扇区所需的时间)。多线程删除会导致多个线程同时试图删除不同区域的文件,这会迫使磁头频繁在不同位置间移动,增加了寻道的次数,从而减慢删除速度。
  2. 顺序读取/写入 vs. 随机读取/写入

    • 机械硬盘的顺序读取和写入性能明显高于随机操作。单线程删除文件时,磁头通常可以顺序地遍历目录并删除文件,效率较高。而多线程删除会导致多个线程竞争 I/O 资源,硬盘磁头频繁地在不同位置来回移动,导致随机 I/O 操作增多,降低了效率。
  3. 多线程 I/O 争用

    • 在 HDD 上并行删除文件,会使多个线程同时发起 I/O 请求。这些并行的 I/O 请求会相互争用硬盘资源,反而会进一步加剧机械硬盘的负载,降低操作效率。

机械硬盘上删除文件的优化策略

虽然多线程删除不适用于机械硬盘,但你可以通过以下方式优化删除操作:

  1. 使用单线程删除

    • 在机械硬盘上,单线程删除通常效率更高,因为它能够让磁头顺序移动,减少寻道时间。直接使用 rm -rffind 命令来逐步删除文件是最稳妥的选择。

    示例:

    rm -rf /path/to/directory 

    find /path/to/directory -type f -delete 
  2. 分批删除

    • 如果要删除的文件数量非常大,可以通过分批删除减少系统资源占用。比如,使用 find 命令结合 xargs,删除指定数量的文件(如每次 1000 个):
    find /path/to/directory -type f | head -n 1000 | xargs rm 
  3. 减少 I/O 优先级

    • 为了避免删除操作对其他系统操作产生影响,可以使用 ionice 降低删除进程的 I/O 优先级:
    ionice -c 3 rm -rf /path/to/directory 

    这样可以让删除操作在后台更平稳地进行,而不会对前台的其他操作造成太大的影响。

  4. 使用 nocache 选项

    • 在删除大量文件时,可以使用 nocache 选项避免文件系统缓存被大量文件操作占用。
    rm -rf --nocache /path/to/directory 

SSD 上的多线程删除

相比之下,多线程删除更适用于 SSD,因为 SSD 没有机械磁头和寻道时间问题。SSD 在处理并行 I/O 时表现得更好,多个线程同时进行删除操作不会显著增加延迟。因此,如果你使用的是 SSD,可以考虑使用多线程删除来加速操作。


http://www.ppmy.cn/devtools/108817.html

相关文章

MySQL数据库的SQL注入漏洞解析

说明:本文仅是用于学习分析自己搭建的SQL漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 …

什么是大数据、有什么用以及学习内容

目录 1.什么是大数据? 2.大数据有什么用? 2.1商业与营销: 2.2医疗与健康: 2.3金融服务: 2.4政府与公共服务: 2.5交通与物流: 2.6教育与个性化学习: 3.学习大数据需要学习哪…

Elasticsearch - SpringBoot 索引与文档相关demo

文章目录 前言Elasticsearch - SpringBoot 索引与文档相关demo1. _cat/* 相关API2. 查看所有索引3. 创建索引4. 检索索引5. 删除索引6. 新增文档7. 更新文档8. 根据索引中的文档 ID 查询文档9. 删除文档前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作…

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和…

Windows 11安装nvm教程

1、nvm是什么 nvm 全名 node.js version management,是一个 nodejs 的版本管理工具。通过它可以安装和切换不同版本的 nodejs,主要解决 node 各种版本存在不兼容现象。   在工作中,我们可能同时在进行2个或者多个不同的项目开发&#xff0…

数据结构:线性表的顺序存储

文章目录 🍊自我介绍🍊线性表的顺序存储介绍概述例子 🍊顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我…

c++ 析构函数详解

C 中的析构函数用于在对象生命周期结束时执行清理任务,如释放内存、关闭文件或其他资源。析构函数是类的一部分,确保对象在销毁时能够正确地清理自身。 1. 析构函数的基本语法 析构函数的定义与构造函数类似,但它以波浪号 ~ 开头&#xff0…

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许…

Linux网络测试和故障排查命令

文章目录 ping 命令常用选项:使用示例:域名解析和 IP 地址响应数据停止 ping 命令统计数据延迟统计 traceroute 命令常用选项:使用示例:命令执行:路由节点详情: mtr 命令使用示例:使用结果详解输…

冒泡排序——基于Java的实现

简介 冒泡排序(Bubble Sort)是一种简单的排序算法,适用于小规模数据集。其基本思想是通过重复遍历待排序的数组,比较相邻的元素并交换它们的位置,以此将较大的元素逐步“冒泡”到数组的末尾。算法的名称源于其运行过程…

HBase

Apache HBase 是一个基于 Hadoop 分布式文件系统(HDFS)构建的分布式、面向列的 NoSQL 数据库,主要用于处理大规模、稀疏的表结构数据。HBase 的设计灵感来自 Google 的 Bigtable,能够在海量数据中提供快速的随机读写操作&#xff…

分类与回归的区别

分类和回归的详细区别如下: 目标变量类型: 分类: 目标变量是离散的,分为若干类别。例如,邮件分类为“垃圾邮件”或“正常邮件”。 回归: 目标变量是连续的,通常是一个数值。例如,预测房价或气温。 输出结果: 分类:…

前端工程化2:从0到1的eslint插件开发教程

从0-1的eslint插件开发教程 开发eslint插件目的:根据项目需要,自定义满足项目特殊需要的校验规则是 参考eslint官方文档展开阐述 插件开发 自定义规则 单元测试 下面开始通过一个示例demo来介绍插件整个开发流程 代码中出现的方法及变量的详细解释与…

PHP一键发起灵活定制多功能投票小程序系统源码

​一键发起,灵活定制 —— 多功能投票小程序 🚀【开篇:告别繁琐,投票新体验】🚀 还在为组织投票活动而头疼不已吗?繁琐的流程、有限的选项、难以统计的结果...这些都将成为过去式!今天&#x…

python---爬取QQ音乐

如Cookie为非vip,仅能获取非vip歌曲 1.下载包 pip install jsonpath 2.代码 import os import time import requests from jsonpath import jsonpathdef search_and_download_qq_music(query_text):headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; …

java后端服务监控与告警:Prometheus与Grafana集成

Java后端服务监控与告警:Prometheus与Grafana集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的微服务架构中,监控和告警是确保服务稳定性的关键组成部分。Pr…

MapSet之相关概念

系列文章: 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 目录 1.搜索 1.1 概念和场景 1.2 模型 2.Map的使用 2.1 关于Map的说明 2.2 关于Map.Entry的说明 2.3 Map的常用方法说明 3.Set的说明 3.1关于Set说明 3.2 常见方法说明 1.搜…

CTFHub技能树-备份文件下载-vim缓存

目录 方法一:直接浏览器访问 方法二:使用kali恢复vim缓存文件 方法三:直接使用curl访问 最后同样备份文件系列的都可用dirsearch扫描 当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当…

“设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)都是常见的设计模式,但它们解决的问题和应用场景不同。下面是它们的区别: 1. 目的不同: 工厂模式(Factory Pattern&#xf…

请解释Java Web应用中的前后端分离是什么?它有哪些好处?什么是Java Web中的Servlet过滤器?它有什么作用?

请解释Java Web应用中的前后端分离是什么?它有哪些好处? Java Web应用中的前后端分离 在Java Web应用中,前后端分离是一种开发模式,它将传统Web开发中紧密耦合的前端(用户界面)和后端(服务器端…