Linux自动备份脚本

要求:将/data目录下的所有文件cp到/var/backups目录下,文件以当天的日期命名。例如(/var/backups/data.20151103)。并且判别前一天的目录中的文件与当天的差异,如果无差异,则删去前一天的备份目录。

# cat auto_bak.sh
#!/bin/bash
bak_from_name=\"data\"
bak_from_dir=\"/data\"
bak_to_dir_par=\"/var/backups\"
bak_dir=\"${bak_to_dir_par}${bak_from_dir}.$(date +%Y%m%d)\"
yes_bak_dir=\"${bak_to_dir_par}${bak_from_dir}.$(date -d \'-1 day\' +%Y%m%d)\"
new_sum_file=\"${bak_to_dir_par}/new_sum.$bak_from_name.$(date +%Y%m%d)\"
old_sum_file=\"${bak_to_dir_par}/old_sum.$bak_from_name.md5\"
if [ ! -d $bak_to_dir_par ];then
    mkdir $bak_to_dir_par
fi
find $bak_from_dir |xargs -I {} md5sum {} >> $new_sum_file 2>/dev/null
cp -a $bak_from_dir $bak_dir && echo \"$bak_from_dir directory to $bak_dir directory backup successfully\"
new_sum_error=`md5sum -c $new_sum_file 2>/dev/null|awk \'$2!~\"OK\"\'|wc -l`
new_sum_ok=`md5sum -c $new_sum_file 2>/dev/null|awk \'$2~\"OK\"\'|wc -l`
old_sum_error=`md5sum -c $old_sum_file 2>/dev/null|awk \'$2!~\"OK\"\'|wc -l`
old_sum_ok=`md5sum -c $old_sum_file 2>/dev/null|awk \'$2~\"OK\"\'|wc -l`
if [ $new_sum_error == $old_sum_error -a $new_sum_ok == $old_sum_ok ];then
    echo \"Because today and yesterday\'s content is the same, delete the backup content of yesterday\"
    rm -rf $yes_bak_dir $new_sum_file
fi
echo | cp $new_sum_file $old_sum_file &>/dev/null

变量描绘:

bak_from_name:变量为所要备份的目录名

bak_from_dir:变量为所要备份的目录途径

bak_to_dir_par:变量为所要备份到的目录的父(上级)目录途径

bak_dir:变量为所要备份到的目录途径

yes_bak_dir:变量为所要备份目录前一天的备份目录途径

new_sum_file:变量为当天所计算出来的所要备份目录的MD5列表

old_sum_file:变量为当天所计算出来的所要备份目录的MD5列表(此变量的当天是脚本履行之后的当前,在脚本才开始履行的时候,该变量所指定的文件为前一天备份目录的MD5列表)

new_sum_error:变量为当天所要备份目录的MD5发生改变的条目总数

new_sum_ok:变量为当天所要备份目录的MD5未发生改变的条目总数

old_sum_error:变量为前一天所要备份目录的MD5发生改变的条目总数

old_sum_ok:变量为前一天所要备份目录的MD5未发生改变的条目总数

脚本描绘:

脚本前一部分是搜寻所要备份目录的每一个文件的md5值,然后记录到当天的所要备份目录的MD5列表文件中,然后履行备份。

后一部分是根据比对当天的所要备份目录的MD5列表文件和前一天的所要备份目录的MD5列表文件中未改变和改变部分的条目值是否相同,来判别所要备份目录中的文件是否有发生改变,以此来决议是否删去前一天的备份。