MD5校验对比脚本
始终显示统计摘要相同、不同、仅存在于 dir1、仅存在于 dir2加上-v选项时同时逐行显示每个文件的详细对比状态保留两种模式严格对比路径 MD5和仅内容对比忽略路径自动处理权限并给出友好的运行提示完整脚本compare_dirs_full.sh#!/bin/bashset-e# 显示帮助信息usage(){catEOF 用法:$0[选项] 目录1 目录2 比较两个目录下所有文件的 MD5 值递归处理子目录。 选项: -v, --verbose 显示每个文件的详细对比状态相同/不同/仅存在 -c, --content-only 只比较文件内容忽略文件名和路径 -h, --help 显示此帮助信息 无论是否使用 -v最后都会输出统计摘要。 示例:$0/root/var/www/html/upload /var/www/html/upload$0-v /root/var/www/html/upload /var/www/html/upload$0-c /root/var/www/html/upload /var/www/html/upload EOFexit1}# 默认参数verbosefalsecontent_onlyfalse# 解析选项OPTS$(getopt-ovch--longverbose,content-only,help-n$0--$)if[$?!0];thenusage;fievalset--$OPTSwhiletrue;docase$1in-v|--verbose)verbosetrue;shift;;-c|--content-only)content_onlytrue;shift;;-h|--help)usage;;--)shift;break;;*)break;;esacdone# 检查参数if[$#-ne2];thenecho错误需要两个目录作为参数usagefidir1$1dir2$2# 验证目录存在if[!-d$dir1];thenecho错误目录 $dir1 不存在exit1fiif[!-d$dir2];thenecho错误目录 $dir2 不存在exit1fi# 创建临时文件并设置清理tmp1$(mktemp)tmp2$(mktemp)traprm -f $tmp1 $tmp2EXIT# 生成 MD5 清单格式为 MD5 相对路径generate_list(){localdir$1localout$2(cd$dirfind.-typef-execmd5sum{}|seds|^\./|||sort-k2)$out}echo正在生成目录 $dir1 的 MD5 清单...generate_list$dir1$tmp1echo正在生成目录 $dir2 的 MD5 清单...generate_list$dir2$tmp2# ----- 仅比较内容忽略文件名 -----if[$content_onlytrue];thenecho--- 仅比较文件内容忽略文件名 ---# 提取 MD5 值排序后比较diff-u(awk{print $1}$tmp1|sort)(awk{print $1}$tmp2|sort)\|sed-e/^---/d-e/^\\\/d-e/^/d||true# 统计交集相同MD5、仅1、仅2comm-12(awk{print $1}$tmp1|sort)(awk{print $1}$tmp2|sort)|wc-l|xargsprintf\n相同内容文件数按MD5: %d\ncomm-23(awk{print $1}$tmp1|sort)(awk{print $1}$tmp2|sort)|wc-l|xargsprintf仅存在于 %s 的内容块数: %d\n$dir1comm-13(awk{print $1}$tmp1|sort)(awk{print $1}$tmp2|sort)|wc-l|xargsprintf仅存在于 %s 的内容块数: %d\n$dir2exit0fi# ----- 严格按路径对比 -----echo--- 对比目录结构和文件内容 ---# 使用 awk 进行逐行比较并收集统计信息awk-vverbose$verbose-vd1$dir1-vd2$dir2 function print_diff(path, md5a, md5b) { if (md5a md5b) print 相同: path else print 不同: path ( d1 : md5a , d2 : md5b ) } BEGIN { same0; diff0; only10; only20 } NRFNR { # 读取第一个清单 path $2; md5[path] $1; next } { # 读取第二个清单 path $2; if (path in md5) { if (md5[path] $1) { same; } else { diff; } if (verbose) print_diff(path, md5[path], $1); delete md5[path]; # 已匹配 } else { only2; if (verbose) print 仅在 d2 : path (MD5: $1 ) } } END { # 剩余在 md5 中的即为仅在 dir1 的文件 for (path in md5) { only1; if (verbose) print 仅在 d1 : path (MD5: md5[path] ) } # 始终输出统计摘要 printf \n 统计摘要 \n printf 相同文件数路径和内容均一致: %d\n, same printf 内容不同的文件数路径相同但MD5不同: %d\n, diff printf 仅存在于 %s 的文件数: %d\n, d1, only1 printf 仅存在于 %s 的文件数: %d\n, d2, only2 } $tmp1$tmp2exit0使用方法保存脚本并赋予执行权限sudovi/usr/local/bin/compare_dirs_full.sh# 或任意位置chmodx /usr/local/bin/compare_dirs_full.sh运行以您的目录为例仅显示统计摘要不输出每个文件的详情sudocompare_dirs_full.sh /root/var/www/html/upload /var/www/html/upload同时显示每个文件的详细状态 统计摘要sudocompare_dirs_full.sh-v/root/var/www/html/upload /var/www/html/upload只比较文件内容忽略路径sudocompare_dirs_full.sh-c/root/var/www/html/upload /var/www/html/upload输出示例带-v时部分输出正在生成目录 /root/var/www/html/upload 的 MD5 清单... 正在生成目录 /var/www/html/upload 的 MD5 清单... --- 对比目录结构和文件内容 --- 相同: images/logo.png 不同: config.ini ( /root/var/www/html/upload: d41d8cd98f00b204e9800998ecf8427e , /var/www/html/upload: 098f6bcd4621d373cade4e832627b4f6 ) 仅在 /var/www/html/upload: temp/cache.tmp (MD5: 5d41402abc4b2a76b9719d911017c592) 统计摘要 相同文件数路径和内容均一致: 120 内容不同的文件数路径相同但MD5不同: 3 仅存在于 /root/var/www/html/upload 的文件数: 5 仅存在于 /var/www/html/upload 的文件数: 2不加-v时只会输出摘要部分不会有详细列表。关键改进点始终输出统计摘要无论是否使用-vawk的END块都会打印四行统计。详细模式与摘要并存-v负责输出每行状态摘要始终在最后给出。清晰区分“路径相同但内容不同”和“仅存在某侧”便于定位问题。临时文件自动清理支持带空格的文件名。如果文件数量极大数十万级若目录包含海量文件生成 MD5 列表可能较慢。此时可以考虑使用parallel并行计算 MD5或改用md5deep工具可参考之前的建议。但本脚本对于常规规模几万文件完全够用。

相关新闻

BQ41Z50 AFE保护配置详解:从阈值计算到延时设置实战指南

BQ41Z50 AFE保护配置详解:从阈值计算到延时设置实战指南

1. 项目概述:为什么AFE保护配置是电池安全的生命线 在电池管理系统(BMS)的江湖里,模拟前端(AFE)芯片就像是守护电池组的“贴身保镖”。它的核心任务不是做复杂的算法,而是7x24小时不间断地“盯梢…

2026/7/24 6:05:33阅读更多 →
TI bq27505阻抗跟踪电量计:高精度电池SOC估算原理与工程实践

TI bq27505阻抗跟踪电量计:高精度电池SOC估算原理与工程实践

1. 项目概述:为什么我们需要一颗“聪明”的电量计?在智能手机、平板电脑或者任何一款便携式设备上,那个小小的电池图标和百分比数字,几乎是我们判断设备还能“撑多久”的唯一依据。但你是否曾疑惑过,为什么有时电量从1…

2026/7/24 6:05:33阅读更多 →
计算机毕业设计之基于SpringBoot的汽车零件销售管理系统

计算机毕业设计之基于SpringBoot的汽车零件销售管理系统

随着汽车行业的蓬勃发展,对汽车零件的高效管理与销售成为提升市场竞争力的关键。本系统采用Java语言开发,结合SpringBoot框架与Vue前端技术,构建了一个功能全面的汽车零件销售管理系统。系统后端基于SpringBoot,以其简洁高效、易于…

2026/7/24 6:05:33阅读更多 →
《我的世界》下载安装全攻略:Java版与基岩版选择指南

《我的世界》下载安装全攻略:Java版与基岩版选择指南

如果你正在寻找《我的世界》的下载安装方法,但面对各种版本、平台和安装包感到困惑,这篇文章将为你提供一份清晰、完整的解决方案。很多人以为下载《我的世界》就是找个安装包点一下,但实际上,从选择正版渠道、区分Java版和基岩版…

2026/7/24 7:35:49阅读更多 →
RadarAI平台:AI技术趋势监控与预测实战指南

RadarAI平台:AI技术趋势监控与预测实战指南

1. 项目概述RadarAI作为一款新兴的AI趋势监控平台,正在改变我们追踪和分析技术演进的方式。这个平台的核心价值在于能够实时捕捉、解析和预测AI领域的技术发展动向,为从业者提供数据驱动的决策支持。我在过去三个月深度测试了RadarAI的各项功能&#xff…

2026/7/24 7:35:49阅读更多 →
程序员如何用AI大模型提升开发效率与职业竞争力

程序员如何用AI大模型提升开发效率与职业竞争力

1. 程序员如何应对AI大模型带来的职业挑战最近半年,AI大模型的发展速度让所有技术从业者都感到震撼。作为在编程领域摸爬滚打十多年的老码农,我亲眼见证了从传统编程到云原生,再到如今AI原生的技术演进。很多同行都在焦虑:大模型会…

2026/7/24 7:35:49阅读更多 →
AI Agent架构重构:从单体到分层设计的工程实践

AI Agent架构重构:从单体到分层设计的工程实践

1. 项目背景与重构动机这次AI Agent项目的第三次重构,源于我们在实际业务场景中遇到的几个关键瓶颈问题。随着业务复杂度提升,原有的单体架构开始暴露出明显的局限性:工具调用响应时间从最初的200ms激增到1.2秒以上,多轮对话的上下…

2026/7/24 7:35:49阅读更多 →
语义搜索技术解析与向量数据库实战优化

语义搜索技术解析与向量数据库实战优化

1. 语义搜索技术在现代AI应用中的核心地位当我们在电商平台输入"适合夏天穿的透气运动鞋"时,传统关键词搜索可能只会机械匹配"夏天"、"透气"、"运动鞋"这些独立词汇,而语义搜索却能理解这实际上是在寻找"具…

2026/7/24 7:35:49阅读更多 →
[C2000实战] 拒绝手撸寄存器:利用 SysConfig 快速配置DSP F2800137的EPWMXBAR功能及参数说明

[C2000实战] 拒绝手撸寄存器:利用 SysConfig 快速配置DSP F2800137的EPWMXBAR功能及参数说明

EPWMXBAR的Sysconfig配置参数详解:这里的TRIP代表DSP内部的硬件故障数据流总线,和具体的外设没有固定的绑定关系,这里的TRIP4可以给EPWM1 的 Digital Compare 进行触发,也可以是TRIP5给EPWM1进行触发保护。每条 TRIP 总线都可以接…

2026/7/24 7:33:49阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →