要求:將/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列表檔案中未變化和變化部分的條目值是否相同,來判斷所要備份目錄中的檔案是否有發生變化,以此來決定是否刪除前一天的備份。