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

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

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

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

md5sum的使用方法见:

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

#!/bin/bash

###########################################################

# description: compare many files one time #

# author : 骏马金龙 #

# blog : http://www.cnblogs.com/f-ck-need-u/ #

###########################################################

# filename: md5.sh# Usage: $0file1 file2 file3 ...

IFS=$'\n'

declare -A md5_array

# If usewhile read loop, the array in whilestatement will

# auto set tonull after the loop, so i use forstatement

# instead thewhile, and so, i modify the variable IFS to

# $'\n'.

# md5sum format: MD5/path/to/file# such as:80748c3a55b726226ad51a4bafa1c4aa/etc/fstabfor line in `md5sum "$@"`

do

index=${line%% *}

file=${line##* }

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

done# Traverse the md5_arrayfor i in ${!md5_array[@]}

do

echo -e "the same file with md5: $i\n--------------\n`echo ${md5_array[$i]}|tr ' ' '\n'`\n"

done

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

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

[root@linuxidc~]# echo haha >>/tmp/fs5

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

[root@linuxidc tmp]# ./md5.sh /tmp/fs[1-6]

the samefilewith md5: a612cd5d162e4620b442b0ff3474bf98--------------------------

/tmp/fs6/tmp/fs3/tmp/fs2/tmp/fs1

the samefilewith md5: 80748c3a55b726226ad51a4bafa1c4aa--------------------------

/tmp/fs4

the samefilewith md5: 30dd43dba10521c1e94267bbd117877b--------------------------

/tmp/fs5

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

[root@linuxidc tmp]# find /tmp -type f -name "fs[0-9]" -print0 | xargs -0 ./md5.shthe samefilewith md5:a612cd5d162e4620b442b0ff3474bf98--------------------------

/tmp/fs6/tmp/fs3/tmp/fs2/tmp/fs1

the samefilewith md5:80748c3a55b726226ad51a4bafa1c4aa--------------------------

/tmp/fs4

the samefilewith 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 <<

不过我最终还是使用了更繁琐的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_arrayfor i in ${!md5_array[@]}do

echo -e "the same file with md5: $i\n--------------\n`echo ${md5_array[$i]}|tr ' ' '\n'`\n"

done

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

  1. 如何在linux下创建一个可运行shell脚本?

    linux系统下,经常会用到自启动脚本,那么如何新建一个自启动脚本? 工具/原料 linux系统 方法/步骤 1 新建一个.sh文件,touch test.sh 2 编辑test.sh文件,vi te ...

  2. 07 linux 一个完整的shell脚本调试工具

    一个完整的shell脚本调试工具 常用的日志输出形式 使用OOP编程思想设计log函数 让log方法象log4j一样 输出时前面带日期和时间 为日志输出添加开关 划分日志等级 并添加颜色 输出到文件 ...

  3. Linux配置脚本导出运行,linux服务器部署jar包以及shell脚本的书写

    背景:记录在linux环境下部署jar程序的过程 1 部署过程记录 1.1 程序结构 这里的main函数就在DemRest2.java 文件中. 为了部署方便,要做到以下两点: 1 在导出的jar包中 ...

  4. 一个不错的shell 脚本教程 入门级

    一个不错的shell 脚本教程 入门级 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2011-10-11 我要评论 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂 ...

  5. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序

    概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...

  6. 一个简单的SHELL脚本模板

    一个简单的SHELL脚本模板,适用于Java项目的启动,停止,重启. 如果在windows上编辑,请使用Notepad++ 设置编码格式为UTF-8无BOM编码,脚本的文档格式为UNIX格式,否则会因 ...

  7. 在Linux下执行一个文件时候提示“权限不够”的解决办法

    在Linux下执行一个文件时候提示"权限不够"的解决办法如下 转到那个文件的目录下面执行下面命令: chmod 777 filename

  8. Shell入门笔记:Linux批量提取文件名/shel文件名提取日期/NCL批量读取文件(shell脚本结合)

    在大型计算时,我们会使用linux系统,而linux系统下使用Shell脚本进行一些批处理任务会十分方便,在这里,我将以我个人遇到的问题为例,结合Shell语言的一些常用命令和知识点,完成对于Shel ...

  9. linux脚本重命名文件,shell脚本批量对文件改名(名字新旧不相关)

    首先,要用到数组,请先看关于数组的基础知识 要求:把电脑中的SRR开头的文件名改为容易识别的Library_Name 电脑中的SRR文件如下: SRR文件 Run和Library_Name的对应关系如 ...

最新文章

  1. 安装Fontawesome4字体图标
  2. tomcat内存溢出问题解决思路
  3. 数据结构-栈4-栈的应用-中缀转后缀
  4. 吴恩达深度学习 —— 2.14 向量化逻辑回归的梯度输出
  5. CH2401 送礼物 双向搜索
  6. linux下sqlserver端口号,linux下连接sqlserver配置及otl编程.docx
  7. eclipse bookmark的使用
  8. 精细运营,这只“蚂蚁”开辟了一条全新的财富之路
  9. 21_在线支付原理与实现
  10. linux多线程编程书籍推荐:linux大牛之路从这几本书開始总结
  11. 关于ancher box 和bounding box的区别
  12. td标签高度属性不起作用
  13. 功能对等四个原则_“奈达功能对等理论”四个方面的原始出处及定义是什么?...
  14. 将java项目部署到腾讯云服务器
  15. python-----定制群发微信消息
  16. UE4|Sequence Recorder 序列记录使用方法
  17. mysql去重分组_mysql 分组 去重
  18. hasp运行不成功_HASP加密锁错误代码原因
  19. java源代码转jar包
  20. React+Next JS 电商主题前台后台模板前端

热门文章

  1. 关于PHP各种循环,关于php迭代循环(无限分类)
  2. php 2010excel,PHPExcel在php5.2.10上的bug
  3. java selenium firefox启动报错大调查
  4. 揭阳学计算机的好学校,揭阳初中排名2020最新排名,揭阳初中排名前十的学校有哪些...
  5. Linux终端嵌套桌面里,linux下终端分屏使用的两种方法(screen和tmux)
  6. mysql5.7.11源码安装,mysql 5.7.11 源码安装
  7. python使用random生成不重复的随机数
  8. ssm mysql增删改查_SSM配置并实现简单的数据库增删改查操作
  9. 华为路由器ospf路由表解读_网络-路由交换-路由基础-华为-OSPF的工作原理
  10. 3904三极管是什么功能_什么是放大器。它有什么特性