当前位置: 首页 > news >正文

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 调度器,例如将调度器改为 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,可以考虑使用多线程删除来加速操作。

相关文章:

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&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第五章下篇----string类的模拟实现 ~ 上篇&#xff1a;★ C基础篇 ★ string类-CSDN博客 C基础篇专栏&#xff1a;★ 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&#xff0c;时间还长 NO COMPRESS 1820 5924 0:5 R…...

创建一个Oracle版本的JDK的Docker镜像

背景说明 OpenJDK 和Oracle JDK 一般情况下我们选择OpenJDK&#xff0c;两者针对大部分场景都可以满足&#xff0c;有些地方例如反射技术获得某些包路径下的类对象等&#xff0c;有时候选择OpenJDK会导致空指针异常。 两者在底层实现方面有部分区别。 创建镜像 这里是Linux…...

Harmony OS DevEco Studio 如何导入第三方库(以lottie为例)?-- HarmonyOS自学2

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

JAVA数据导出为Excel

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

【数据结构与算法 | 灵神题单 | 快慢指针(链表)篇】力扣876, 2095, 234

1. 力扣876&#xff1a;链表的中间节点 1.1 题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,…...

第十五届蓝桥杯图形化省赛题目及解析

第十五届蓝桥杯图形化省赛题目及解析 一. 单选题 1. 运行以下程序&#xff0c;角色会说( )? A、29 B、31 C、33 D、35 正确答案&#xff1a;C 答案解析&#xff1a; 重复执行直到m>n不成立&#xff0c;即重复执行直到m<n。所有当m小于或者 等于n时&…...

linux下NTP服务器实战(chrony软件)

linux下NTP服务器实战(chrony软件) 记录linux下NTP服务器搭建及相关管理操作&#xff0c;使用chrony软件包安装部署。相比ntp服务&#xff0c;Chrony服务适用于更高精度、更高稳定性、自动化等场景。 1. 安装 chrony 在大多数Linux发行版上&#xff0c;chrony可以通过包管理…...

Java设计模式之命令模式介绍和案例示范

一、命令模式简介 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户端进行参数化、对请求排队或记录日志&#xff0c;以及支持可撤销的操作。命令模式的核心思想是将发出请…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...