当前位置: 澳门新濠3559 > 操作系统 > 正文

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

时间:2019-11-07 21:41来源:操作系统
shell脚本示例:批量比较多个文件的内容是否相同澳门新濠3559。但md5sum只好通过翻看md5值来直接比较文件是不是风流洒脱致,要落成批量机关比较,则须求写成循环。脚本如下: (3).i

shell脚本示例:批量比较多个文件的内容是否相同澳门新濠3559。但md5sum只好通过翻看md5值来直接比较文件是不是风流洒脱致,要落成批量机关比较,则须求写成循环。脚本如下:

(3).index和file变量是为着将md5sum的每风度翩翩行结果拆分成三个变量,MD5局地作为数组的index,file作为数组变量值的一片段。因而,数组赋值语句为:

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

唯独diff命令只好给定四个文件参数,因而不恐怕贰遍性相比比较多少个文本(目录也被当作文件),何况diff比较非文本类文件或然特大的文书时间效果与利益率相当低。

前几日,/tmp目录下有6个文件fs1、fs2、fs3、fs4、fs5和fs6,此中fs4和fs5被改变,剩余4个文本内容完全相似。


更具通用性地相比艺术:相比多少个目录下的同名文件。

# Traverse the md5_array
for i in ${!md5_array[@]}
do
    echo -e "the same file with md5: $in--------------n`echo ${md5_array[$i]}|tr ' ' 'n'`n"
done  
while read index file;do
    md5_array[$index]="$file ${md5_array[$index]}"
done <<<"$(md5sum "$@")"
[root@xuexi tmp]# ./md5.sh /tmp/fs[1-6]
the same file with md5: a612cd5d162e4620b442b0ff3474bf98
--------------------------
/tmp/fs6
/tmp/fs3
/tmp/fs2
/tmp/fs1

the same file with md5: 80748c3a55b726226ad51a4bafa1c4aa
--------------------------
/tmp/fs4

the same file with md5: 30dd43dba10521c1e94267bbd117877b
--------------------------
/tmp/fs5
#!/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 "$@"`
do
    index=${line%% *}
    file=${line##* }
    md5_array[$index]="$file ${md5_array[$index]}"
done

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

bash&shell类别小说:http://www.cnblogs.com/f-ck-need-u/p/7048359.html**

[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
IFS=$'n'
for line in `md5sum "$@"`
do
    index=${line%% *}
    file=${line##* }
    md5_array[$index]="$file ${md5_array[$index]}"
done

剧本表达:

那儿能够行使md5sum来完结,相比较diff的逐行比较,md5sum的进程快的多的多。

为了测验该脚本,先复制多少个文本,并更改此中多少个文本的剧情,举例:

要比较五个公文的原委是还是不是完全风流倜傥致,能够大概地接纳diff命令。比如:

(4).数组赋值达成后,起头遍历数组。遍历的艺术有各种。作者使用的是遍历数组的index列表,即每行的MD5值。

[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/fs1

the same file with md5:80748c3a55b726226ad51a4bafa1c4aa
--------------------------
/tmp/fs4

the same file with md5:30dd43dba10521c1e94267bbd117877b
--------------------------
/tmp/fs5

(2).一发端的时候笔者利用while循环,从标准输入中读取各样文件md5sum的结果。语句如下:

(1).md5sum总结的结果格式为"MD5 /path/to/file",因而要在结果中既输出MD5值,又输出相通MD5对应的文书,思虑接纳数组。

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

然而我最终照旧使用了更麻烦的for循环:

md5sum的行使办法见:Linux中文件MD5校验。

diff file1 file2 &>/dev/null;echo $?
md5_array[$index]="$file ${md5_array[$index]}"

但md5sum的每行结果中有两列,而for循环接纳暗中认可的IFS会将这两列分割为七个值,由此还改善了IFS变量的值为$'n',使得生龙活虎行赋值叁次变量。

编辑:操作系统 本文来源:shell脚本示例:批量比较多个文件的内容是否相同

关键词: