shell脚本示例:批量比较多个文件的内容是否相同
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脚本示例:批量比较多个文件的内容是否相同相关推荐
- php批量替换文件内容,Shell脚本实现批量替换文件内容
Shell脚本实现批量替换文件内容 今天同事发现内部服务器的硬盘空间不够了,上面有很多备份,我又不能删除,重新找了个320g的硬盘挂载了上,想以后shell脚本下的备份都转移到新硬盘上,给老硬盘腾出空 ...
- linux shell脚本自动批量解压文件
单个文件解压很简单,批量不确定目录的压缩包呢?解压到原路径?解压后删除原压缩包?本脚本可一键解决以上所有问题 linux shell脚本自动批量解压文件 脚本免费下载地址: 传送门https://do ...
- Linux系统shell脚本之批量修改服务器密码
Linux系统shell脚本之批量修改服务器密码 一.脚本要求 二.脚本内容 三.编辑原始旧密码 四.执行脚本 五.验证密码更改 1.查看更改后的密码文件 2.在远端服务器验证密码 一.脚本要求 可以 ...
- Linux shell 脚本实现u盘挂载及文件拷贝
Linux shell 脚本实现u盘挂载及文件拷贝 对于linux系统来说.使用mount命令(需管理员模式使用)来进行挂载硬盘 对于我的虚拟机来说.在插入u盘时,使用sudo fdisk -l命令设 ...
- 多个html文件内容合并,Bat批量将多个文件夹内容合并一个文件夹
方法一 把各文件夹内所有文件内并到自动建的一个合并文件夹内,如有同名文件在主名后附容_序号. 将以下内容保存到新建的txt文件中,重命名txt文件后缀用txt改为bat,双击运行.@echo off ...
- linux批量执行一个脚本文件,shell脚本示例:批量比较多个文件的内容是否相同...
要比较两个文件的内容是否完全一致,可以简单地使用diff命令.例如: diff file1 file2 &>/dev/null;echo $? 但是diff命令只能给定两个文件参数,因此 ...
- shell脚本执行php文件_分享两个shell脚本实例--批量生成随机字符文件名和批量改名...
概述 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数.这使得 ...
- shell脚本:批量检查并更改MySQL数据库表的存储引擎工作中总结
Work Description: 在搭建完Percona XtraDB Cluster(一种MySQL架构,简称PXC),需要把old mysql中的数据导入到new mysql中,但PXC只支持I ...
- 基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识
遍历目录 cd destination cd 命令可接受单个参数 destination ,用以指定想切换到的目录名.如果没有为 cd 命令指定目标路径,它将切换到用户主目录. destination ...
最新文章
- c语言写简单运行批处理,PC-LINT批处理的简单编写
- 面试归来,我有一个重要发现……
- eclipse项目迁移到Android Studio
- 爬虫实战:嗅事百科段子多页爬取
- Keyword-Driven Testing
- elasticsearch httpclient认证机制
- Python 购物车
- des算法密码多长_密码学中的多个DES
- webpack打包原理_webpack打包原理入门探究(四)插件探究(上)
- jstack 脚本 自动日志_运维老司机又翻车, 居然没用过日志切割Logrotate
- Tensorflow官方文档学习理解 (五)-卷积MNIST
- win10易升计算机丢失,微软Windows 10易升
- sql插入后返回id
- mysql函数思维导图
- 电赛模拟训练日志总结三(红外光通信装置)
- sl400通过ac无法连接psk加密无线网络
- 回顾马云屌丝岁月的惨状:多次被拒失声痛哭
- 热门股权转让项目:临沂泰森置业发展有限公司70%股权转让
- 我的Hadoop安装流程
- 认定科技型中小企业,这些好处一定要知道
热门文章
- Python-EEG工具库MNE中文教程(9)-参考电极应用
- HoloLens开发入门
- 英特尔溢价4倍收购还遭拒!RISC-V芯片公司SiFive说想独立上市
- 转入肥胖基因改造RNA,作物增产50%
- 二次元妹子五官画风都能改,周博磊团队用无监督方法控制GAN | CVPR 2021
- NeurIPS 2020中国入选论文:新一代算法“鉴黄师”诞生,中科院计算所研究生一作...
- 潘建伟团队最新研究成果登上Nature:首次实现1120公里长距离无中继纠缠量子密钥分发...
- MIT造了个“小盒子”,可以无线监测新冠患者症状,斯隆奖获得者班底打造
- 对话英特尔研究院院长:量子计算是马拉松,现在大家(包括谷歌)刚跑出第一英里...
- Shell编程—【01】shell中常用的字符串操作