Mac rsync+fswatch(inotify) 全自动同步

原创脚本,在bash下通用,mac下是fswatch(从brew安装),linux换成inotifywait即可,脚本写到这水平真不是一般的NB。
用法:

  1. 脚本参数和fswatch参数一致。
  2. fswatch默认忽略了.git .svn和IDE的meta文件,需要忽略其他自行添加即可(可写死可传递命令行参数)。
  3. 在脚本内部也可以设置全局忽略,见$excludeCommon变量,针对单个项目设置忽略见exclude[0]变量。
  4. $projectArr是根叔组,其他数组全部是关联叔组,$rsyncArr设置rsync服务端参数,这个必须和$projectArr一一对应。
  5. 要做到同样的功能,这个脚本的NB程度已经是极限。
#!/usr/bin/env bash
dirPrefixPhp='/Users/Ares/Documents/Work/php'
excludeCommon="app/cache/* app/logs/*"
projectArr[0]=$dirPrefixPhp'/project1'
projectArr[1]=$dirPrefixPhp'/project2'
rsyncArr[0]='-e "ssh -p222" root@xxx.xxx.xxx.xxx:/srv/www/project1'
rsyncArr[1]='root@xxx.xxx.xxx.xxx:/srv/www/project2'
#wild card,seperated by space
exclude[0]=""
watchArgs=$*
if [ -z "$watchArgs" ];then
	watchArgs='.'
fi
fswatch --exclude=.git --exclude=.svn --exclude=.settings --exclude=.project --exclude=.buildpath $watchArgs|while read v;do
	if [ ! -e $v ];then
		continue
	fi
	for k1 in ${!projectArr[*]};do
		dirPrefix=${projectArr[$k1]}
		if [ "${v:0:${#dirPrefix}}" = "$dirPrefix" ];then
			path=${v#$dirPrefix}
			excludeK1=($excludeCommon' '${exclude[$k1]})
			if [ -n "$excludeK1" ];then
				for v2 in ${excludeK1[*]};do
					if [[ "${path:1}" == $v2 ]];then
						break 2
					fi
				done
			fi
			rsync='rsync -avz -R --chown apache:apache'
			rsync="cd ${projectArr[$k1]} && "$rsync' .'$path' '${rsyncArr[$k1]}' --no-p --no-t'
			dst=${rsyncArr[$k1]#*@}
			#dst=${dst%:*}
			echo -n '['`date +%H:%M:%S`'] '{projectArr[$k1]##*/}$path' => '$dst
			#echo -n '['`date +%H:%M:%S`']' $dst$path
			time=$( (time eval $rsync > /dev/null) 2>&1|head -n2|tail -n1|cut -f2)
			if [ 0 -eq $? ];then
				echo -ne " 33[32mok33[0m"
			else
				echo -ne " 33[31mfailed33[0m"
			fi
			echo '('${time:2}')'
		fi
	done
done

运行结果展示

project1/app/conf/app.ini => xxx.xxx.xxx.xxx:/srv/www/project1 ok(0.001s)
project2/app/conf/app.ini => xxx.xxx.xxx.xxx:/srv/www/project2 ok(0.003s)
project3/doc/sms.png => xxx.xxx.xxx.xxx failed(0.002s)

 

发表评论

电子邮件地址不会被公开。

CAPTCHA

*