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

MD5校验对比脚本

  • 始终显示统计摘要(相同、不同、仅存在于 dir1、仅存在于 dir2)
  • 加上-v选项时,同时逐行显示每个文件的详细对比状态
  • 保留两种模式:严格对比(路径 + MD5)仅内容对比(忽略路径)
  • 自动处理权限,并给出友好的运行提示

完整脚本:compare_dirs_full.sh

#!/bin/bashset-e# 显示帮助信息usage(){cat<<EOF 用法:$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}# 默认参数verbose=falsecontent_only=false# 解析选项OPTS=$(getopt-ovch--longverbose,content-only,help-n"$0"--"$@")if[$?!=0];thenusage;fievalset--"$OPTS"whiletrue;docase"$1"in-v|--verbose)verbose=true;shift;;-c|--content-only)content_only=true;shift;;-h|--help)usage;;--)shift;break;;*)break;;esacdone# 检查参数if[$#-ne2];thenecho"错误:需要两个目录作为参数"usagefidir1="$1"dir2="$2"# 验证目录存在if[!-d"$dir1"];thenecho"错误:目录 '$dir1' 不存在"exit1fiif[!-d"$dir2"];thenecho"错误:目录 '$dir2' 不存在"exit1fi# 创建临时文件并设置清理tmp1=$(mktemp)tmp2=$(mktemp)trap'rm -f "$tmp1" "$tmp2"'EXIT# 生成 MD5 清单:格式为 "MD5 相对路径"generate_list(){localdir="$1"localout="$2"(cd"$dir"&&find.-typef-execmd5sum{}+|sed's|^\./||'|sort-k2)>"$out"}echo"正在生成目录 '$dir1' 的 MD5 清单..."generate_list"$dir1""$tmp1"echo"正在生成目录 '$dir2' 的 MD5 清单..."generate_list"$dir2""$tmp2"# ----- 仅比较内容(忽略文件名) -----if["$content_only"=true];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\n"comm-23<(awk'{print $1}'"$tmp1"|sort)<(awk'{print $1}'"$tmp2"|sort)|wc-l|xargsprintf"仅存在于 %s 的内容块数: %d\n""$dir1"comm-13<(awk'{print $1}'"$tmp1"|sort)<(awk'{print $1}'"$tmp2"|sort)|wc-l|xargsprintf"仅存在于 %s 的内容块数: %d\n""$dir2"exit0fi# ----- 严格按路径对比 -----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 { same=0; diff=0; only1=0; only2=0 } NR==FNR { # 读取第一个清单 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""$tmp2"exit0

使用方法

  1. 保存脚本并赋予执行权限

    sudovi/usr/local/bin/compare_dirs_full.sh# 或任意位置chmod+x /usr/local/bin/compare_dirs_full.sh
  2. 运行(以您的目录为例)

    • 仅显示统计摘要(不输出每个文件的详情)
      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,只会输出摘要部分(不会有详细列表)。


关键改进点

  • 始终输出统计摘要:无论是否使用-vawkEND块都会打印四行统计。
  • 详细模式与摘要并存-v负责输出每行状态,摘要始终在最后给出。
  • 清晰区分“路径相同但内容不同”和“仅存在某侧”,便于定位问题。
  • 临时文件自动清理,支持带空格的文件名。

如果文件数量极大(数十万级)

若目录包含海量文件,生成 MD5 列表可能较慢。此时可以考虑:

  • 使用parallel并行计算 MD5,或改用md5deep工具(可参考之前的建议)。
  • 但本脚本对于常规规模(几万文件)完全够用。

http://www.jsqmd.com/news/1252627/

相关文章:

  • 2026年7月最新欧米茄龙湖宁波鄞州天街维修保养服务电话 - 欧米茄官方服务中心
  • 需求评审清单 —— 鸿蒙AI智能助手开发全流程解析
  • 2026年7月最新|積家香港售後服務中心電話與網點地址攻略 - 积家官方售后服务中心
  • 从Llama到ChatGLM:AIGC大模型渐进式学习路线
  • 2026年7月最新劳力士上海临港海港中心万象汇维修保养服务电话 - 劳力士官方服务中心
  • Python之面向对象- 类属性、类方法练习
  • BQ4050 SBS命令实战:从安全模式到生产测试全流程解析
  • AI时代程序员核心技能重构与实践指南
  • AGI技术突破与行业准备度深度分析
  • HiPRAG:动态门控优化RAG系统检索效率
  • TVP5146与TVP5150A VBI原始数据模式配置详解与工程实践
  • 在线去水印用什么工具?2026实测这5个在线去水印网站免费好用 - 免费软件工具方法教程
  • AI技术助力跨境电商合规:Ozon平台实战解析
  • 劳力士保养价格查询|网点地址与客服热线权威信息公告(2026年7月最新) - 劳力士官方服务中心
  • 自监督学习的语义理解困境与突破路径
  • 南宁劳力士售后客服电话及网点地址2026年7月最新权威通知 - 劳力士服务中心
  • 华为OD机试C++题解:滑动窗口与哈希集合破解字符串解密
  • QMCDecode解密原理与实战:解锁QQ音乐加密格式的完整指南
  • 劳力士中国售后服务中心|最新地址和维修热线权威信息公示(2026年7月最新) - 劳力士服务中心
  • Unity打包后UMP视频黑屏?5个系统化解决方案与深度排查指南
  • OpenClaw:基于Gateway与AI Agent的智能助手架构解析
  • Google Flash模型工具:数学公式转3D打印的完整实践指南
  • MSP430 LCD_B寄存器配置与EEM高级调试实战指南
  • 劳力士中国售后服务中心|完整热线和最新维修地址权威信息公告(2026年7月最新) - 劳力士服务中心
  • BQ41Z50高级充电算法:从参数配置到电池寿命优化的工程实践
  • 2026上海宝山区装修公司口碑评级榜 入住业主真实评价汇总表 - 资讯报道
  • 低代码IDE与生成式AI结合加速企业级AI代理开发
  • TVMSTofu视频管理平台:多光谱智能监控与AI分析实践
  • 声明:天津劳力士售后网点地址与客服电话2026年7月最新版本 - 劳力士官方服务中心
  • 原生鸿蒙像素画板实战 20:拼豆模板生成