比较2个目录找出不同的文件

#!/bin/bash
function filter_in()
{
	res=0
	if [[ -z "${1}" || "${1}" == "*" ]];then
		echo "1"
		return 
	fi
	
	for n in ${1}
	do
		if [[ "${2}" = *"${n}" ]];then  #单"[]"不能使用通配符  
			res=1
			break
		fi
	done 
	
	echo "${res}"	
}

function filter_out()
{
	res=0
	if [[ -z "${1}" ]];then
		echo "0"
		exit
	fi
	
	for n in ${1}
	do
		if [[ "${2}" = *"${n}" ]];then  #单"[]"不能使用通配符			
			res=1
			break
		fi
	done 
	
	echo "${res}"	
}

function process_dir()
{
	echo "dir:${1}"
	
}

function process_file()
{	
	if [[ $(filter_in "${2}" "${1}/${file}") != 1 ||  $(filter_out "${3}" "${1}/${file}") == 1 ]];then		
		return		
	fi
	file_new=${1}
	file_old="${DIR_OLD}"/"${file_new:((DIR_NEW_LEN+1))}"
	if [ -e ${file_old} ];then
		diff ${file_new} ${file_old} > /dev/null
		if [ $? != 0 ];then
			let DIFF_FILE_CNT++
			if [ -n "${DIR_DIFF_NEW}" ];then 
				out_dir=${DIR_DIFF_NEW}/${file_new:((DIR_NEW_LEN+1))}
				out_dir=${out_dir%/*}  #使用通配符截断字符串		
				if [ ! -e "${out_dir}" ];then
					echo "mkdir -p ${out_dir}"
				fi
				echo "cp -rf ${file_new} ${DIR_DIFF_NEW}/${file_new:((DIR_NEW_LEN+1))}"	
			else
				echo "diff(${DIFF_FILE_CNT}):${file_new}    ${file_old}"		
			fi						
		fi
		
	fi
}

function traverse_directory()
{
	f=$(ls ${1})	
	for file in ${f}
	do 
		if [ -d "${1}/${file}" ];then 	
			#process_dir	"${1}/${file}"	
			traverse_directory "${1}/${file}" 		
		else
			let TOTAL_FILE_CNT++			
			process_file "${1}/${file}" "${INS[*]}" "${OUTS[*]}" #数组作为一个函数参数传递时,必须使用双引号""
		fi
	done
}

if [ $# -eq 4 ];then
	DIR_NEW=${1}
	DIR_OLD=${2}
	DIR_DIFF_NEW=${3}
	DIR_DIFF_OLD=${4}
elif [ $# -eq 3 ];then
	DIR_NEW=${1}
	DIR_OLD=${2}
	DIR_DIFF_NEW=${3}
elif [ $# -eq 2 ];then
	DIR_NEW=${1}
	DIR_OLD=${2}
else
	echo "param error"
	exit 
fi

#数组的定义,这里只是为了使用数组,才这样定义的,也可以定义成".c .h .cpp .hpp .mk .sh .mak .ini" 传递参数时不用"${INS[*]" 使用"${INS}"
#INS=(.c .h .cpp .hpp .mk .sh .mak .ini)
#INS=(".c" ".h")
#INS=(.c .h)
#OUTS=(".out" ".abs" ".bin")
#OUTS=(.c)

DIR_NEW_LEN=${#DIR_NEW}
DIR_OLD_LEN=${#DIR_OLD}
TOTAL_FILE_CNT=0
DIFF_FILE_CNT=0
START_TIME=$(date +%s)
traverse_directory  "${DIR_NEW}" 
END_TIME=$(date +%s)
ELSPSE_TIME=$(( END_TIME-START_TIME))
echo "ELSPSE_TIME:${ELSPSE_TIME}s,TOTAL_FILE_CNT:${TOTAL_FILE_CNT},DIFF_FILE_CNT:${DIFF_FILE_CNT}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值