比较两个主机指定目录下全部文件是否相同的SHELL脚本

适用于WEB应用双机负载,比较应用目录是否一致,脚本执行前已经做好了ssh密钥认证,本例用第一台机器的目录为标准进行比较

[root@v73 tmp]# cat /root/diffdir3.sh

#!/bin/bash
if [ $# != 4 ]; then                 #脚本接收4个参数,源IP,源目录,目的IP,目的目录,目录必须用/的方式结束,不足补齐
echo "pls input four args"
exit 1;
fi
md51name=`echo $2 | sed 's#\/#.#g'`.md5sums1  #拼接出存放文件的相对路径和MD5值的文件名
md52name=`echo $4 | sed 's#\/#.#g'`.md5sums2
ssh -n $1 "find $2 -type f|xargs md5sum|"sed s#$2##g" > /tmp/$md51name"  #计算出存放文件的相对路径和MD5值,已经去掉了两个目录的绝对路径,这样可比较两个不同路径下的目录
scp $1:/tmp/$md51name /tmp/                                              #拷贝这个文件到执行脚本机器的/tmp目录
ssh -n $3 "find $4 -type f|xargs md5sum|"sed s#$4##g" > /tmp/$md52name"
scp $3:/tmp/$md52name /tmp/
while read line1                      #以源目录为标准,开始比较,在done <<< "$(cat /tmp/$md51name)"已经指定
do
	flags=0                               #标记文件是否找到,在嵌套的循环中会引用
	files1=`echo $line1 | cut -d" " -f2`  #源目录文件的相对路径   
		while read line2                  #读取目的目录的信息,在done <<< "$(cat /tmp/$md52name)"已经指定
			do
				files2=`echo $line2 | cut -d" " -f2`  #目的目录文件的相对路径
				if [ $files1 = $files2 ]; then        #找到源目相同的文件
				#标记文件存在找到,采用这种方式引用变量是因为变量经过管道的传递,使用变量常用的方式赋值将不能通过while的管道传递变量
				flags=$(($flags+1))                   
				m51=`echo $line1 | cut -d" " -f1`     #文件相同比较MD5值
				m52=`echo $line2 | cut -d" " -f1`
				[ $m51 != $m52 ] && echo "$files1 md5chg."
				break                                       #找到相同的文件并且比较MD5值之后马上跳出此次循环,节省资源,开始匹配下一个文件
				fi
			done <<< "$(cat /tmp/$md52name)"

	[ $flags != 1 ] && echo "$files1 notexists."

done <<< "$(cat /tmp/$md51name)"

 

执行效果:

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页