linux下文件形式的更新与回滚(增加回滚删除与新增后的回滚)

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#!/bin/bash
#20150619重新定义编辑升级脚本
#update.sh
#1、更新升级
#2、回滚升级
# 1、查看回滚目录
#  2、选择回滚目录
#3、退出升级
#update|rollback
#ROLLBACK_HOME_DOC目录根据自己需要进行修改
NEW_DOC=$1
OLD_DOC=$2
if [ $# -lt 2 ];then
echo "参数错误"
echo "格式: ./update.sh [NEW_DOC] [OLD_DOC] [update/rollback]"
else
UPDATE_TIME=`date +%Y%m%d%H%M%S`
echo "格式: ./update.sh [NEW_DOC] [OLD_DOC] [update/rollback]"
read -p "输入项目名字: " PROJECT_NAME
ROLLBACK_HOME_DOC=/data/rollback/$PROJECT_NAME
function update(){
if [ -d $NEW_DOC ] && [ -d $OLD_DOC ];then
####################################################################
##创建回滚备份目录
for DOC in `find $NEW_DOC -type d`
   do
       ROLLBACK_DOC=`echo $DOC|sed 's#'$NEW_DOC'#'$UPDATE_TIME'/#'`
       mkdir -p /$ROLLBACK_HOME_DOC/$ROLLBACK_DOC/
#echo $PROJECT_NAME
done
####################################################################
for NEW_FILE in `find $NEW_DOC -type f`
    do
       for OLD_FILE in `echo $NEW_FILE|sed 's#'$NEW_DOC'#'$OLD_DOC'#'`
          do
            if [ -f $OLD_FILE ];then
		ROLLBACK_FILE=`echo $OLD_FILE|sed 's#'$OLD_DOC'#'$ROLLBACK_HOME_DOC'/'$UPDATE_TIME'/#'`
               \cp $OLD_FILE $ROLLBACK_FILE && echo "代码备份"
               \cp $NEW_FILE $OLD_FILE      && echo "代码更新替换"
            else
                if [ -d $(dirname $OLD_FILE) ];then
                    \cp $NEW_FILE $OLD_FILE && echo "新代码文件复制完成"
		    R_F=`echo $NEW_FILE|sed 's#'$NEW_DOC'#'$ROLLBACK_HOME_DOC'/'$UPDATE_TIME'/#'`
                    \cp $NEW_FILE $R_F"."NEW  && echo "新文件生成回滚记录"
                else	
                   mkdir -p $(dirname $OLD_FILE) && echo  "创建文件目录成功"
                   R_D=`dirname $NEW_FILE|sed 's#'$NEW_DOC'#'$ROLLBACK_HOME_DOC'/'$UPDATE_TIME'/#'`
		    mkdir -p $R_D"."NEW
		   \cp $NEW_FILE $OLD_FILE && echo "新代码文件复制完成"
		   R_F=`echo $NEW_FILE|awk -F "/" '{print $NF}'`
		   \cp $NEW_FILE $R_D"."NEW/$R_F"."NEW  && echo "新文件生成回滚记录"
		fi
            fi
       done
done             
else
	echo "参数有误"
fi
}
function rollback_list(){
       if [ -d $ROLLBACK_HOME_DOC ];then
          echo "最近10个升级备份记录:"
          ls -lsth $ROLLBACK_HOME_DOC/ |awk '{print $NF}'|sed '1d'|head -10|sed 's#^#'$ROLLBACK_HOME_DOC/'#'|awk '{print "["NR"]",$0"/"}'
       else
          echo "此项目未进行升级备份"
          exit
       fi
}
function rollback_num(){
        R_=`ls -lsth $ROLLBACK_HOME_DOC/ |awk '{print $NF}'|sed '1d'|sed 's#^#'$ROLLBACK_HOME_DOC/'#'|awk '{print "["NR"]",$0"/"}'|awk '{print $2}'|sed -n ''$ROLLBACK_ACTION'p'`
       if [ `find $R_ -type f|wc -l` -gt 0 ];then
	###回滚升级
           for R_FILE in `find $R_ -type f|grep -v NEW`
              do
                 O_FILE=`echo $R_FILE|sed 's#'$R_'#'$OLD_DOC'#'`
                 \cp $R_FILE $O_FILE && echo "代码回滚成功"
           done
	###删除新增
	  for R_FILE in `find $R_ -type f|grep NEW`
	     do
		O_FILE=`echo $R_FILE|sed 's#'$R_'#'$OLD_DOC'#'|sed 's#'\.NEW'##'`
		if [ -f $O_FILE ];then
			rm $O_FILE && echo "新增移出"
		fi
	     done
	  for R_DIR in `find $R_ -type d |grep NEW`
	     do
	      O_DIR=`echo $R_DIR|sed 's#'$R_'#'$OLD_DOC'#'|sed 's#'\.NEW'##'`
	     	if [ -d $O_DIR ];then
		  rm -rf  $O_DIR && echo "新增目录移出"
		fi
	  done
	rm -rf  $R_ && echo "移出回滚备份目录"
       else
           echo "此升级备份丢失,回滚失败"
        fi
}
function rollback(){
        read -p "请选择回滚历史: " ROLLBACK_ACTION
        case $ROLLBACK_ACTION in
        1)
        rollback_num
        ;;
        2)
        rollback_num
        esac
}
case $3 in 
update)
    update
    ;;
rollback)
   rollback_list
   rollback
   ;;
*)
echo "请选执行动作:
      1、代码升级
      2、代码回滚
      3、退出"
read -p "请输入执行动作: " ACTION_1 
case $ACTION_1 in
1)
  update
  ;;
2)
  rollback_list
  rollback
;;
3)
exit
;;
esac 
esac
fi