多文件比对

要比对多个存储目录下的文件是否存在重复文件,可以通过以下步骤实现 MD5 值的比对:

1. 提取文件路径

  • 首先从你的目录结构中获取所有文件的路径,可以使用 find 命令递归列出所有文件路径:
    find /traixxxnent/zpxxxxx -type f > file_list.txt
    find /yfxxxmanent/zpxxxx -type f >> file_list.txt
    # 对表中每个目录重复上述命令,保存到同一个文件 file_list.txt
    

2. 计算文件的 MD5 值

  • 使用以下脚本对文件列表中的每个文件计算 MD5 值:
    while read filepath; domd5sum "$filepath" >> md5_checksums.txt
    done < file_list.txt
    
  • 输出的 md5_checksums.txt 文件会包含每个文件的路径和对应的 MD5 值。

3. 查找重复文件

  • 使用以下命令找出相同的 MD5 值(重复文件):

    awk '{print $1}' md5_checksums.txt | sort | uniq -d > duplicate_md5.txt
    
  • 使用以下脚本列出重复的文件路径:

    grep -Ff duplicate_md5.txt md5_checksums.txt > duplicate_files.txt
    
  • duplicate_files.txt 文件中会列出所有重复文件的路径。

4. 输出结果

  • 如果需要输出重复的文件或路径,可以根据你的需求格式化结果。

Python 脚本:

[root@rg2-bgw-prometheus001 mmwei3]# cat test_file_md5_compare_v2.py
import hashlib
import os# 目录列表
directories = ["/train33/asrmlg/permanent/zpxie2","/yfw-b3-mix01/asrmlg/permanent/zpxie2",# 继续添加其他目录
]# 用于存储文件的 MD5 值和路径
md5_dict = {}# 计算文件的 MD5 值
def calculate_md5(file_path):hasher = hashlib.md5()with open(file_path, "rb") as f:for chunk in iter(lambda: f.read(4096), b""):hasher.update(chunk)return hasher.hexdigest()# 遍历目录
for directory in directories:for root, _, files in os.walk(directory):for file in files:file_path = os.path.join(root, file)file_md5 = calculate_md5(file_path)if file_md5 in md5_dict:md5_dict[file_md5].append(file_path)else:md5_dict[file_md5] = [file_path]# 输出重复文件
print("重复的文件路径:")
for md5, paths in md5_dict.items():if len(paths) > 1:print(f"MD5: {md5}")for path in paths:print(f"  {path}")

5、当然针对海量的小文件,我们可以换个车略比对,比如直接抛弃大小不同的。

[root@rg2-bgw-prometheus001 mmwei3]# cat test_file_md5_compare.py
import hashlib
import os
from collections import defaultdict# List of directories to check
directories = ["/train33/asrmlg/permanent/zpxie2","/yfw-b3-mix01/asrmlg/permanent/zpxie2",# Add more directories as needed
]size_dict = defaultdict(list)
md5_dict = {}# Group files by size
for directory in directories:for root, _, files in os.walk(directory):for file in files:file_path = os.path.join(root, file)try:file_size = os.path.getsize(file_path)size_dict[file_size].append(file_path)except OSError:continue  # Skip files that cannot be accessed# Compute the MD5 hash for files with the same size
def calculate_md5(file_path):hasher = hashlib.md5()with open(file_path, "rb") as f:for chunk in iter(lambda: f.read(4096), b""):hasher.update(chunk)return hasher.hexdigest()for size, files in size_dict.items():if len(files) > 1:  # Only calculate MD5 for files with the same sizefor file_path in files:file_md5 = calculate_md5(file_path)if file_md5 in md5_dict:md5_dict[file_md5].append(file_path)else:md5_dict[file_md5] = [file_path]# Print duplicate files
print("Duplicate file paths:")
for md5, paths in md5_dict.items():if len(paths) > 1:print(f"MD5: {md5}")for path in paths:print(f"  {path}")

6、或者使用concurrent.futures利用多线程处理也可以

[root@rg2-bgw-prometheus001 mmwei3]# cat test_file_md5_compare_v3.py
from concurrent.futures import ThreadPoolExecutor
import hashlib
import os
from collections import defaultdict# List of directories to check
directories = ["/train33/asrmlg/permanent/zpxie2","/yfw-b3-mix01/asrmlg/permanent/zpxie2",# Add more directories as needed
]size_dict = defaultdict(list)
md5_dict = {}# Group files by size
for directory in directories:for root, _, files in os.walk(directory):for file in files:file_path = os.path.join(root, file)try:file_size = os.path.getsize(file_path)size_dict[file_size].append(file_path)except OSError:continue  # Skip files that cannot be accessed# Function to calculate the MD5 hash of a file
def calculate_md5(file_path):hasher = hashlib.md5()with open(file_path, "rb") as f:for chunk in iter(lambda: f.read(4096), b""):hasher.update(chunk)return file_path, hasher.hexdigest()# Use multithreading to compute MD5 hashes
with ThreadPoolExecutor(max_workers=8) as executor:for size, files in size_dict.items():if len(files) > 1:  # Only process files with the same sizefutures = {executor.submit(calculate_md5, file): file for file in files}for future in futures:file_path, file_md5 = future.result()if file_md5 in md5_dict:md5_dict[file_md5].append(file_path)else:md5_dict[file_md5] = [file_path]# Print duplicate files
print("Duplicate file paths:")
for md5, paths in md5_dict.items():if len(paths) > 1:print(f"MD5: {md5}")for path in paths:print(f"  {path}")

7、可以参考fdupes

https://github.com/adrianlopezroche/fdupes.git
在这里插入图片描述

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

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

相关文章

46. Three.js案例-创建颜色不断变化的立方体模型

46. Three.js案例-创建颜色不断变化的立方体模型 实现效果 知识点 Three.js基础组件 WebGLRenderer THREE.WebGLRenderer是Three.js提供的用于渲染场景的WebGL渲染器。它支持抗锯齿处理&#xff0c;可以设置渲染器的大小和背景颜色。 构造器 antialias: 是否开启抗锯齿&am…

【51单片机零基础-chapter6:LCD1602调试工具】

实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…

【GO基础学习】gin的使用

文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则&#xff0c;执行的函数// gin.Context&#x…

杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装

JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;简单的外部应用电路非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不需要外部隔离二极管。热反馈可对充电电流进…

Linux实验报告14-Linux内存管理实验

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一&#xff1a;实验目的 (1)掌握内核空间、用户空间&#xff…

供需平台信息发布付费查看小程序系统开发方案

供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户&#xff1a;寻找兼职工作、二手物品交换、本地服务&#xff08;如家政、维修&#xff09;等。 小微企业&#xff1a;推广产品和服务&#xff0c;寻找合…

overleaf写学术论文常用语法+注意事项+审阅修订

常用语法 导入常用的宏包 \usepackage{cite} \usepackage{amsmath,amssymb,amsfonts} \usepackage{algorithmic} \usepackage{algorithm} \usepackage{graphicx} \usepackage{subfigure} \usepackage{textcomp} \usepackage{xcolor} \usepackage{lettrine} \usepackage{booktab…

动态规划<八> 完全背包问题及其余背包问题

目录 例题引入---找到解决问题模版 LeetCode 经典OJ题 1.第一题 2.第二题 3.第三题 其余的一些背包问题 1.二维费用的背包问题 例题引入---找到解决问题模版 OJ 传送门 牛客 DP42 【模板】完全背包 画图分析: 使用动态规划解决(第二问与第一问的不同之处用绿色来标记) 1.…

TP8 前后端跨域访问请求API接口解决办法

报错&#xff1a;Access to XMLHttpRequest at http://www.e.com/api/v1.index/index?t1735897901267 from origin http://127.0.0.1:5500 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: The value of the Access-Contr…

【前端系列】Pinia状态管理库

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、Pinia状态管理库&#xff1a;☀️☀️☀️2.1 pinia基本使用① pinia充当中转站存放token② 使用步骤 2.1 axios请求拦截器 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;…

打造三甲医院人工智能矩阵新引擎(四):医疗趋势预测大模型篇 EpiForecast与DeepHealthNet合成应用

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗领域积累了海量的数据,涵盖电子病历、医学影像、基因序列、临床检验结果等多源异构信息。这些数据蕴含着疾病发生发展、治疗反应、疫情传播等规律,为医疗趋势预测提供了数据基础。准确的医疗趋势预测能辅助医疗机构提前…

C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数&#xff0c;获取物料的信息&#xff0c;并生成Excel文件 上接文章&#xff1a;C#服务 文章目录 创建函数创建结构编写源代码创建批处理文件运行结果-成功部署服务器C#代码配置文件注意&#xff01;&#xff01; 创建函数 创建结构 编写源代码 创建…

OFDM学习-(二)长短序列和PPDU整体数据处理流程

OFDM学习 &#xff08;二&#xff09;长短序列和PPDU整体数据处理流程 OFDM学习前言一、短序列短序列的作用 二、长序列三、PLCP/SIGNAL/DATA数据处理流程三、fpga实现STS模块LTS模块训练序列模块仿真波形 总结 前言 根据框图可以知道发射机这部分信号在DA转换之前&#xff0c…

leetcode 173.二叉搜索树迭代器栈绝妙思路

以上算法题中一个比较好的实现思路就是利用栈来进行实现&#xff0c;以下方法三就是利用栈来进行实现的&#xff0c;思路很好&#xff0c;很简练。进行next的时候&#xff0c;先是一直拿到左边的子树&#xff0c;直到null为止&#xff0c;这一步比较好思考一点&#xff0c;下一…

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…

kubernetes学习-kubectl命令、探针(二)

一、在任意节点使用 kubectl # 在master节点获取节点信息 [rootk8s-master k8s]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 16h v1.23.6 k8s-node1 Ready <none> …

关于IDE的相关知识之三【插件安装、配置及推荐的意义】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于ide插件安装、配置及推荐意义的相关内容…

Node 如何生成 RSA 公钥私钥对

一、引入crypto模块 crypto 为node 自带模块&#xff0c;无需安装 const crypto require(crypto);二、封装生成方法 async function generateRSAKeyPair() {return new Promise((resolve, reject) > {crypto.generateKeyPair(rsa, {modulusLength: 2048, // 密钥长度为 …

数字PWM直流调速系统设计(论文+源码)

2.1 系统方案设计 2.2.1开环控制方案 采用开环方案的系统架构如图2.1所示&#xff0c;这种方式不需要对直流电机的转速进行检测&#xff0c;在速度控制时单片机只需要直接发出PWM就可以实现直流电机速度的控制。这种方式整体设计难度较低&#xff0c;但是无法准确得知当前的…

w~多模态~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663226 #Vista-LLaMA Vista-LLaMA 在处理长视频内容方面的显著优势&#xff0c;为视频分析领域带来了新的解决框架。AI解读视频张口就来&#xff1f;这种「幻觉」难题给解决了 近年来&#xff0c;大型语言模型如 GPT、…