linux 自动备份脚本
2015-02-04 15:36
369 查看
写作一个备份/etc目录的脚本,要求:将/etc目录下的所有文件cp到/var/backups目录下
的以当天的日期命名的目录中例如(/var/backups/etc.20140809)。
并且判断前一天的目录中的文件与当天的区别,如果无区别,则删除前一天的备份目录。
[root@nolinux scripts]# cat auto_bak.sh
#!/bin/bash
#
# This script is used to automatically backup the specified directory, and judgment, and whether the previous backup
# Written by sunsky
# Mail : 274546888@qq.com
# Date : 2014-8-16 23:00:00
#
bak_from_name="etc"
bak_from_dir="/etc"
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`
##awk '$2 ~ "OK"' 中的 ~ 是awk的运算符,表示匹配 , !~ 表示不匹配
#if [ $new_sum_error == $old_sum_error -a $new_sum_ok == $old_sum_ok ];then
if [[ $new_sum_error == $old_sum_error && $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
PS:
echo | cp $new_sum_file $old_sum_file &>/dev/null 发现这样是覆盖不了的,我机子的cp默认是 cp -i 了
[root@vagrant-centos64 ~]# which cp
alias cp='cp -i'
/bin/cp
所以写成cp的绝对路径就可以了
/bin/cp $new_sum_file $old_sum_file &>/dev/null,而且我也不知道"echo | "是干嘛的
针对以上脚本的简单描述:
本脚本将所有涉及到的目录都声明了变量,这样子就方便脚本功能的灵活收缩。无论是变更所要备份的目录项还是变更备份到的目录项都很另外。由于题目要求不采用打包的方式备份,因此本脚本不涉及对脚本的打包管理。
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列表文件中未变化和变化部分的条目值是否相同,来判断所要备份目录中的文件是否有发生变化,以此来决定是否删除前一天的备份。
的以当天的日期命名的目录中例如(/var/backups/etc.20140809)。
并且判断前一天的目录中的文件与当天的区别,如果无区别,则删除前一天的备份目录。
[root@nolinux scripts]# cat auto_bak.sh
#!/bin/bash
#
# This script is used to automatically backup the specified directory, and judgment, and whether the previous backup
# Written by sunsky
# Mail : 274546888@qq.com
# Date : 2014-8-16 23:00:00
#
bak_from_name="etc"
bak_from_dir="/etc"
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`
##awk '$2 ~ "OK"' 中的 ~ 是awk的运算符,表示匹配 , !~ 表示不匹配
#if [ $new_sum_error == $old_sum_error -a $new_sum_ok == $old_sum_ok ];then
if [[ $new_sum_error == $old_sum_error && $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
PS:
echo | cp $new_sum_file $old_sum_file &>/dev/null 发现这样是覆盖不了的,我机子的cp默认是 cp -i 了
[root@vagrant-centos64 ~]# which cp
alias cp='cp -i'
/bin/cp
所以写成cp的绝对路径就可以了
/bin/cp $new_sum_file $old_sum_file &>/dev/null,而且我也不知道"echo | "是干嘛的
针对以上脚本的简单描述:
本脚本将所有涉及到的目录都声明了变量,这样子就方便脚本功能的灵活收缩。无论是变更所要备份的目录项还是变更备份到的目录项都很另外。由于题目要求不采用打包的方式备份,因此本脚本不涉及对脚本的打包管理。
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列表文件中未变化和变化部分的条目值是否相同,来判断所要备份目录中的文件是否有发生变化,以此来决定是否删除前一天的备份。
相关文章推荐
- Linux下自动备份Mysql数据库脚本(已测试)
- Mysql for linux mysql自动备份脚本
- Linux ftp 自动上传备份文件脚本
- 最全最强悍的linux自动备份+自动删除老的备份脚本
- Linux自动备份并ssh scp传输到远程备份脚本 免密钥
- ORACLE自动备份并且自动FTP到备份机的SHELL脚本(http://doc.linuxpk.com/456.html)
- Linux下mysql定时自动备份并FTP到远程脚本
- MySQL :: Linux 下自动备份数据库的 shell 脚本
- LINUX 自动备份脚本
- Linux VPS/服务器 网站及数据库自动本地备份并FTP上传备份脚本
- 在linux下用脚本自动备份domino和WebSphere Portal(转自YGBLOG)
- sybase ASE在unix&linux上的自动备份脚本
- linux下mysql自动备份脚本代码
- Linux通过脚本实现远程自动备份
- Linux下Oracle自动备份脚本
- Linux平台和Windows平台下两种自动备份MySQL数据的脚本(Shell&Bat)和步骤
- Linux下 Oracle自动备份脚本及其运行设置
- Linux 下通过脚本实现远程自动备份
- Linux 定期自动备份脚本
- Mysql for linux mysql自动备份脚本