linux批量执行一个脚本文件,shell脚本示例:批量比较多个文件的内容是否相同...
要比较两个文件的内容是否完全一致,可以简单地使用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脚本示例:批量比较多个文件的内容是否相同...相关推荐
- 如何在linux下创建一个可运行shell脚本?
linux系统下,经常会用到自启动脚本,那么如何新建一个自启动脚本? 工具/原料 linux系统 方法/步骤 1 新建一个.sh文件,touch test.sh 2 编辑test.sh文件,vi te ...
- 07 linux 一个完整的shell脚本调试工具
一个完整的shell脚本调试工具 常用的日志输出形式 使用OOP编程思想设计log函数 让log方法象log4j一样 输出时前面带日期和时间 为日志输出添加开关 划分日志等级 并添加颜色 输出到文件 ...
- Linux配置脚本导出运行,linux服务器部署jar包以及shell脚本的书写
背景:记录在linux环境下部署jar程序的过程 1 部署过程记录 1.1 程序结构 这里的main函数就在DemRest2.java 文件中. 为了部署方便,要做到以下两点: 1 在导出的jar包中 ...
- 一个不错的shell 脚本教程 入门级
一个不错的shell 脚本教程 入门级 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2011-10-11 我要评论 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂 ...
- 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序
概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...
- 一个简单的SHELL脚本模板
一个简单的SHELL脚本模板,适用于Java项目的启动,停止,重启. 如果在windows上编辑,请使用Notepad++ 设置编码格式为UTF-8无BOM编码,脚本的文档格式为UNIX格式,否则会因 ...
- 在Linux下执行一个文件时候提示“权限不够”的解决办法
在Linux下执行一个文件时候提示"权限不够"的解决办法如下 转到那个文件的目录下面执行下面命令: chmod 777 filename
- Shell入门笔记:Linux批量提取文件名/shel文件名提取日期/NCL批量读取文件(shell脚本结合)
在大型计算时,我们会使用linux系统,而linux系统下使用Shell脚本进行一些批处理任务会十分方便,在这里,我将以我个人遇到的问题为例,结合Shell语言的一些常用命令和知识点,完成对于Shel ...
- linux脚本重命名文件,shell脚本批量对文件改名(名字新旧不相关)
首先,要用到数组,请先看关于数组的基础知识 要求:把电脑中的SRR开头的文件名改为容易识别的Library_Name 电脑中的SRR文件如下: SRR文件 Run和Library_Name的对应关系如 ...
最新文章
- 安装Fontawesome4字体图标
- tomcat内存溢出问题解决思路
- 数据结构-栈4-栈的应用-中缀转后缀
- 吴恩达深度学习 —— 2.14 向量化逻辑回归的梯度输出
- CH2401 送礼物 双向搜索
- linux下sqlserver端口号,linux下连接sqlserver配置及otl编程.docx
- eclipse bookmark的使用
- 精细运营,这只“蚂蚁”开辟了一条全新的财富之路
- 21_在线支付原理与实现
- linux多线程编程书籍推荐:linux大牛之路从这几本书開始总结
- 关于ancher box 和bounding box的区别
- td标签高度属性不起作用
- 功能对等四个原则_“奈达功能对等理论”四个方面的原始出处及定义是什么?...
- 将java项目部署到腾讯云服务器
- python-----定制群发微信消息
- UE4|Sequence Recorder 序列记录使用方法
- mysql去重分组_mysql 分组 去重
- hasp运行不成功_HASP加密锁错误代码原因
- java源代码转jar包
- React+Next JS 电商主题前台后台模板前端
热门文章
- 关于PHP各种循环,关于php迭代循环(无限分类)
- php 2010excel,PHPExcel在php5.2.10上的bug
- java selenium firefox启动报错大调查
- 揭阳学计算机的好学校,揭阳初中排名2020最新排名,揭阳初中排名前十的学校有哪些...
- Linux终端嵌套桌面里,linux下终端分屏使用的两种方法(screen和tmux)
- mysql5.7.11源码安装,mysql 5.7.11 源码安装
- python使用random生成不重复的随机数
- ssm mysql增删改查_SSM配置并实现简单的数据库增删改查操作
- 华为路由器ospf路由表解读_网络-路由交换-路由基础-华为-OSPF的工作原理
- 3904三极管是什么功能_什么是放大器。它有什么特性