备份策略为每周一至周六执行增量备份,周日执行全备份。使用 tar 实现。
#!/bin/bash
#Automatic Backup Linux System Files
#By Author Book_Wu
#Define Variables 参数定义
SOURCE_DIR=($*) #以数组的形式存放需要备份的目录,执行脚本时需要手动指定
TARGET_DIR=/home/jialing/learn/data/backup/ #指定备份路径
YEAR=`date +%Y` #年
MONTH=`date +%m` #月
DAY=`date +%d` #日
WEEK=`date +%u` #礼拜
NAME=`date +%H%M` #时分
FILES=${NAME}_system_backup.tgz #定义压缩文件格式
CODE=$? #判断是否有错
if [ -z $SOURCE_DIR ]; then #如果没有指定参数则提示
echo -e "Please Enter a File or Directory You Need to Backup:\n---------------------------------------------------------------\nExample $0 /boot /etc ..."
exit
fi
#Determine Whether the Target Directory Exists 判断当天的备份目录是否存在
if [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ]; then
mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY #不存在则创建目录
echo "This $TARGET_DIR Created Successfully!" #提示信息
fi
#EXEC Full_Backup Function Command 以下是全备份
Full_Backup(){
if [ "$WEEK" -eq "7" ];then #指定周日进行完整备份
rm -rf $TARGET_DIR/snapshot #先删除原本目录下的快照
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ; tar -g $TARGET_DIR/snapshot -cvzf $FILES `echo ${SOURCE_DIR[@]}` #完整备份的命令,echo前面不是单引号,${SOURCE_DIR[@]}是指定的一个或多个需要备份的目录
[ "$CODE" == "0" ]&&echo -e "---------------------------------------------------------------\nFull_Backup System Files Backup Successfully!" #如果以上命令没有问题则提示成功
fi
}
#Perform incremental BACKUP Function Command 以下是增量备份
Add_Backup(){
cd $TARGET_DIR/$YEAR/$MONTH/$DAY;
if [ -f $TARGET_DIR/$TEAR/$MONTH/$DAY/$FILES ]; then #判断增量备份文件是否存在
read -p "$FILES Already Exists, overwrite confirmation yes or no? : " SURE #存在则询问是否重新创建
if [ $SURE == "no" -o $SURE == "n"]; then #不需要则退出
sleep 1; exit 0
fi
#Add_Backup Files System
if [ "$WEEK" -ne "7" ];then #重新创建,除周日进行增量备份
cd $TARGET_DIR/$YEAR/$MONTH/$DAY; tar -g $TARGET_DIR/snapshot -czvf $$_$FILES `echo ${SOURCE_DIR[@]}` #与上条命令的区别是文件名不同,$$是程序的进程号
[ "$CODE" == "0" ]&&echo -e "---------------------------------------------------------------\nAdd_Backup System Files Backup Successfully!" #如果以上命令没问题则提示成功
fi
else #文件不存在,增量备份
if [ "$WEEK" -ne "7" ];then
cd $TARGET_DIR/$YEAR/$MONTH/$DAY; tar -g $TARGET_DIR/snapshot -cvzf $FILES `echo ${SOURCE_DIR[@]}` #与上条命令的区别是文件名不同
[ "$CODE" == "0" ]&&echo -e "---------------------------------------------------------------\nAdd_Backup System Files Bakcup Successfully!" #如果以上命令没问题则提示成功
fi
fi
}
Full_Backup;Add_Backup
执行结果:
如果需要测试全备份,可以把系统时间改为周日,或者把脚本中周日进行全备份改为当前时间。