代码: 全选
#!/bin/bash
#备份文件的一个脚本,按1、2、3自动进行备份
#可实现全部备份,只备份修改过或增加过的文件
#可以实现有选择的恢复
#如果大家能用的着,只要修改一下里面相关的参数就可以了
echo "####################################################"
echo "# press 1 to bakup all file #"
echo "# #"
echo "# press 2 to bakup change file #"
echo "# #"
echo "# press 3 to recovery all file #"
echo "# #"
echo "####################################################"
echo "press key1 key2 or key3:"
read key
#检查输入的是不是 数字1 、2或者3;不是的话就要重新输入
until [ $key -eq 1 ] || [ $key -eq 2 ] || [ $key -eq 3 ];do
echo "press key1 key2 or key3! "
read key_ag
key=$key_ag
done
#定义脚本退出状态变量
WORNG_INPUT=5
WORNG_DIR=4
#定义全部备份的函数
bakall ()
{
#检查所要备份的目录是否是一个目录
if [ ! -d /home/$USER ];then
echo "/home/$USER is not a dir or donot exsit"
exit $WORNG_DIR
fi
#如果存放备份文件的目录里没有以今天为日期的tarball,就进行备份,否则退出。
if [ ! -e /home/tmp`date +%m-%d`.tar ];then
echo "This is first to bakup /home/$USER!"
tar -cvf /home/tmp`date +%m-%d`.tar /home/$USER
else
echo "today alreaday bakup all file!"
fi
#在/tmp目录下生成临时文件,这个文件的修改日期就是下次进行增量备份时所查找文件的日期。
[ -e /tmp/time ] || touch /tmp/time
echo "`date +%m-%d`" >/tmp/time
exit 0
}
#定义增量备份函数
bakupdate ()
{
#检查所要备份的目录是否是一个目录
if [ ! -d /home/$USER ];then
echo "/home/$USER is not a dir or donot exist"
exit $WORNG_DIR
fi
#检查存放备份文件的目录,如果有今天为日期的增量备份文件就打印消息,函数结束。
if [ -e /home/tmp`date +%m-%d`update.tar ];then
echo "today alreaday bakupdate!"
else
if [ ! -e /home/tmp*.tar ];then #如果存放备份文件的目录没有任何tarball,调用全部备份的函数
echo "This is first time to bakupdate!"
bakall
else #备份原目录里有更新的文件
echo "progrem will bakup changed file"
find /home/$USER -newer /tmp/time -exec tar -cvf /home/tmp`date +%m-%d`update.tar {} \;
echo "`date +%m-%d`" > /tmp/time
fi
fi
exit 0
}
#定义恢复函数,这个函数我就不说明了吧·~很简单 自己看了
forward ()
{
ls -lh /home | grep ".*tar$"
echo "slect which tarball will recover"
echo 'input file name as this sample : tmp???update.tar'
read TARBALL
until [ -e /home/$TARBALL ];do
echo "input file is not exsit! please input again:"
read TARBALL_ag
TARBALL=$TARBALL_ag
done
tar -xvf /home/$TARBALL -C /home
echo " recover done!"
exit 0
}
#执行case语句,根据所选的选项调用不同的函数
case "$key" in
1) bakall
;;
2) bakupdate
;;
3) forward
;;
*) exit $WORNG_INPUT
;;
esac