bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


要比较两个文件的内容是否完全一致,可以简单地使用diff命令。例如:

diff file1 file2 &>/dev/null;echo $?

但是diff命令只能给定两个文件参数,因此无法一次性比较多个文件(目录也被当作文件),而且diff比较非文本类文件或者极大的文件时效率极低。

这时可以使用md5sum来实现,相比diff的逐行比较,md5sum的速度快的多的多。

md5sum的使用方法见:Linux中文件MD5校验。

但md5sum只能通过查看md5值来间接比较文件是否相同,要实现批量自动比较,则需要写成循环。脚本如下:

#!/bin/bash
###########################################################
#  description: compare many files one time               #
#  author     : 骏马金龙                                   #
#  blog       : http://www.cnblogs.com/f-ck-need-u/       #
############################################################ filename: md5.sh
# Usage: $0 file1 file2 file3 ...IFS=$'\n'
declare -A md5_array# If use while read loop, the array in while statement will
# auto set to null after the loop, so i use for statement
# instead the while, and so, i modify the variable IFS to
# $'\n'.# md5sum format: MD5  /path/to/file
# such as:80748c3a55b726226ad51a4bafa1c4aa /etc/fstab
for line in `md5sum "$@"`
doindex=${line%% *}file=${line##* }md5_array[$index]="$file ${md5_array[$index]}"
done# Traverse the md5_array
for i in ${!md5_array[@]}
doecho -e "the same file with md5: $i\n--------------\n`echo ${md5_array[$i]}|tr ' ' '\n'`\n"
done 

为了测试该脚本,先复制几个文件,并修改其中几个文件的内容,例如:

[root@xuexi ~]# for i in `seq -s' ' 6`;do cp -a /etc/fstab /tmp/fs$i;done
[root@xuexi ~]# echo ha >>/tmp/fs4
[root@xuexi ~]# echo haha >>/tmp/fs5

现在,/tmp目录下有6个文件fs1、fs2、fs3、fs4、fs5和fs6,其中fs4和fs5被修改,剩余4个文件内容完全相同。

[root@xuexi tmp]# ./md5.sh /tmp/fs[1-6]
the same file with md5: a612cd5d162e4620b442b0ff3474bf98
--------------------------
/tmp/fs6
/tmp/fs3
/tmp/fs2
/tmp/fs1the same file with md5: 80748c3a55b726226ad51a4bafa1c4aa
--------------------------
/tmp/fs4the same file with md5: 30dd43dba10521c1e94267bbd117877b
--------------------------
/tmp/fs5

更具通用性地比较方法:比较多个目录下的同名文件。

[root@xuexi tmp]# find /tmp -type f -name "fs[0-9]" -print0 | xargs -0 ./md5.sh
the same file with md5:a612cd5d162e4620b442b0ff3474bf98
--------------------------
/tmp/fs6
/tmp/fs3
/tmp/fs2
/tmp/fs1the same file with md5:80748c3a55b726226ad51a4bafa1c4aa
--------------------------
/tmp/fs4the same file with md5:30dd43dba10521c1e94267bbd117877b
--------------------------
/tmp/fs5

脚本说明:

(1).md5sum计算的结果格式为"MD5 /path/to/file",因此要在结果中既输出MD5值,又输出相同MD5对应的文件,考虑使用数组。

(2).一开始的时候我使用while循环,从标准输入中读取每个文件md5sum的结果。语句如下:

md5sum "$@" | while read index file;domd5_array[$index]="$file ${md5_array[$index]}"
done

但由于管道使得while语句在子shell中执行,于是while中赋值的数组md5_array在循环结束时将失效。所以可改写为:

while read index file;domd5_array[$index]="$file ${md5_array[$index]}"
done <<<"$(md5sum "$@")"

不过我最终还是使用了更繁琐的for循环:

IFS=$'\n'
for line in `md5sum "$@"`
doindex=${line%% *}file=${line##* }md5_array[$index]="$file ${md5_array[$index]}"
done

但md5sum的每行结果中有两列,而for循环采用默认的IFS会将这两列分割为两个值,因此还修改了IFS变量的值为$'\n',使得一行赋值一次变量。

(3).index和file变量是为了将md5sum的每一行结果拆分成两个变量,MD5部分作为数组的index,file作为数组变量值的一部分。因此,数组赋值语句为:

md5_array[$index]="$file ${md5_array[$index]}"

(4).数组赋值完成后,开始遍历数组。遍历的方法有多种。我采用的是遍历数组的index列表,即每行的MD5值。

# Traverse the md5_array
for i in ${!md5_array[@]}
doecho -e "the same file with md5: $i\n--------------\n`echo ${md5_array[$i]}|tr ' ' '\n'`\n"
done  

shell脚本示例:批量比较多个文件的内容是否相同相关推荐

  1. php批量替换文件内容,Shell脚本实现批量替换文件内容

    Shell脚本实现批量替换文件内容 今天同事发现内部服务器的硬盘空间不够了,上面有很多备份,我又不能删除,重新找了个320g的硬盘挂载了上,想以后shell脚本下的备份都转移到新硬盘上,给老硬盘腾出空 ...

  2. linux shell脚本自动批量解压文件

    单个文件解压很简单,批量不确定目录的压缩包呢?解压到原路径?解压后删除原压缩包?本脚本可一键解决以上所有问题 linux shell脚本自动批量解压文件 脚本免费下载地址: 传送门https://do ...

  3. Linux系统shell脚本之批量修改服务器密码

    Linux系统shell脚本之批量修改服务器密码 一.脚本要求 二.脚本内容 三.编辑原始旧密码 四.执行脚本 五.验证密码更改 1.查看更改后的密码文件 2.在远端服务器验证密码 一.脚本要求 可以 ...

  4. Linux shell 脚本实现u盘挂载及文件拷贝

    Linux shell 脚本实现u盘挂载及文件拷贝 对于linux系统来说.使用mount命令(需管理员模式使用)来进行挂载硬盘 对于我的虚拟机来说.在插入u盘时,使用sudo fdisk -l命令设 ...

  5. 多个html文件内容合并,Bat批量将多个文件夹内容合并一个文件夹

    方法一 把各文件夹内所有文件内并到自动建的一个合并文件夹内,如有同名文件在主名后附容_序号. 将以下内容保存到新建的txt文件中,重命名txt文件后缀用txt改为bat,双击运行.@echo off ...

  6. linux批量执行一个脚本文件,shell脚本示例:批量比较多个文件的内容是否相同...

    要比较两个文件的内容是否完全一致,可以简单地使用diff命令.例如: diff file1 file2 &>/dev/null;echo $? 但是diff命令只能给定两个文件参数,因此 ...

  7. shell脚本执行php文件_分享两个shell脚本实例--批量生成随机字符文件名和批量改名...

    概述 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数.这使得 ...

  8. shell脚本:批量检查并更改MySQL数据库表的存储引擎工作中总结

    Work Description: 在搭建完Percona XtraDB Cluster(一种MySQL架构,简称PXC),需要把old mysql中的数据导入到new mysql中,但PXC只支持I ...

  9. 基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

    遍历目录 cd destination cd 命令可接受单个参数 destination ,用以指定想切换到的目录名.如果没有为 cd 命令指定目标路径,它将切换到用户主目录. destination ...

最新文章

  1. c语言写简单运行批处理,PC-LINT批处理的简单编写
  2. 面试归来,我有一个重要发现……
  3. eclipse项目迁移到Android Studio
  4. 爬虫实战:嗅事百科段子多页爬取
  5. Keyword-Driven Testing
  6. elasticsearch httpclient认证机制
  7. Python 购物车
  8. des算法密码多长_密码学中的多个DES
  9. webpack打包原理_webpack打包原理入门探究(四)插件探究(上)
  10. jstack 脚本 自动日志_运维老司机又翻车, 居然没用过日志切割Logrotate
  11. Tensorflow官方文档学习理解 (五)-卷积MNIST
  12. win10易升计算机丢失,微软Windows 10易升
  13. sql插入后返回id
  14. mysql函数思维导图
  15. 电赛模拟训练日志总结三(红外光通信装置)
  16. sl400通过ac无法连接psk加密无线网络
  17. 回顾马云屌丝岁月的惨状:多次被拒失声痛哭
  18. 热门股权转让项目:临沂泰森置业发展有限公司70%股权转让
  19. 我的Hadoop安装流程
  20. 认定科技型中小企业,这些好处一定要知道

热门文章

  1. Python-EEG工具库MNE中文教程(9)-参考电极应用
  2. HoloLens开发入门
  3. 英特尔溢价4倍收购还遭拒!RISC-V芯片公司SiFive说想独立上市
  4. 转入肥胖基因改造RNA,作物增产50%
  5. 二次元妹子五官画风都能改,周博磊团队用无监督方法控制GAN | CVPR 2021
  6. NeurIPS 2020中国入选论文:新一代算法“鉴黄师”诞生,中科院计算所研究生一作...
  7. 潘建伟团队最新研究成果登上Nature:首次实现1120公里长距离无中继纠缠量子密钥分发...
  8. MIT造了个“小盒子”,可以无线监测新冠患者症状,斯隆奖获得者班底打造
  9. 对话英特尔研究院院长:量子计算是马拉松,现在大家(包括谷歌)刚跑出第一英里...
  10. Shell编程—【01】shell中常用的字符串操作