電腦王51期「Linux灌後餘生」參考資料

Script程式範例下載 部份程式解說 實作「backup.sh」 #!/bin/bash #設定備份資料保存天數 reserveday=30 #設定完全備份天數 fullbackupday=7 #避免重複執行備份程式 [ -e "/tmp/backup.lst" -o "`whoami`" != "root" ] && exit [ ! -d "/backup" ] && mkdir “/backup” ls –full-time “/backup” | tr -s ” ” | sed 1d > “/tmp/backup.lst” 利用ls指令將之前的備份檔清單用stdout的方式重新導入/tmp/backup.lst成為一個純文字檔,並且在導入當中利用sed指令配合參數1d刪除掉第一行的「總計 XXXX」敘述,讓backup.lst清單檔內只留下檔案清單

#在此設定要備份的目錄
for backupdir in “/etc” “/home”
do
#找尋備份目錄最下層目錄名稱做為備份檔主檔名
i=2
while [ "`echo $backupdir | cut -d "/" -f "$i"`" ]
do
i=$(($i+1))
done
backupdirtail=”`echo $backupdir | cut -d “/” -f “$(($i-1))”`”

這裡我們利用一個迴圈,簡單的從備份路徑抓備份目錄名稱,放進backupdirtail變數做為備份檔的儲存檔案

#判斷要進行完全備份還是增量備份
i=1
while [ "$i" -le "`cat "/tmp/backup.lst" | wc -l`" ]
do
backupname=”`sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 6`”
if [ "`date -d $backupname +%s`" -ge "`date -d "$fullbackupday days ago" +%s`" ]; then

利用wc指令計算截取的backup.lst備份檔案清單行數,再代入while迴圈中。然後用sed指令取出每一行的內容,再利用grep指令判斷該行所指出的檔案是否為一個fullback檔案,並且是否為目前備份的目錄。如果條件符合,則製作增量備份清單後開始進行增量備份

#有找到完全備份檔,進行增量備份後結束
if [ "`sed -n "$i"p "/tmp/backup.lst" | grep "fullbackup" | grep "$backupdirtail"`" ]; then
#製作增量備份檔清單
find “$backupdir” -newer “last_backup_time” -type f > /tmp/incbackup.lst 2> /dev/null

if [ -s "/tmp/incbackup.lst" ]; then
#製作已移除檔案清單
sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 9 > “/tmp/tmpfile1″
tar tf “/backup/`cat “/tmp/tmpfile1″`” | awk ‘{print “/”$0}’ > “/tmp/tmpfile2″
j=1
while [ "$j" -le "`cat "/tmp/tmpfile2" | wc -l`" ]
do
[ ! -e "`sed -n "$j"p "/tmp/tmpfile2"`" ] && sed -n “$j”p “/tmp/tmpfile2″ >> “/backup/$backupdirtail`date +%Y-%m-%d`.rm.lst”
j=$(($j+1))
done

這裡我們是利用sed指令的格式化功能代入迴圈$i的變數擷取出每行內容,再配合cut指令擷取/tmp/backup.lst純文字檔清單中的檔名欄位,然後利用awk指令將取出的檔案及路徑最前面加上根目錄位置「/」

接著再取出已經備份的檔案清單並且與新增檔案相比較,如果檔案不存在原本的備份清單中,則將檔案記錄起來,以便還原時能根據清單設定值還原原本的檔案狀態

#根據清單備份並加上日期
tar zcf “/backup/$backupdirtail`date +%Y-%m-%d`.tar.gz” -T “/tmp/incbackup.lst” 2> “/dev/null”
fi
rm “/tmp/incbackup.lst”
break
fi
fi
i=$(($i+1))
done

根據上面製作的新進檔案清單incbackup.lst內容將新進檔案備份起來

#進行完全備份
if [ "$i" -gt "`cat "/tmp/backup.lst" | wc -l`" ]; then
tar zcf “/backup/$backupdirtail”"`date +%Y-%m-%d`.fullbackup.tar.gz” “$backupdir” 2> “/dev/null”

如果在上面的迴圈當中都沒有找到之前備份的封裝檔的話,變數i會一直累加直到超過backup.lst備份清單檔總行數才會脫離迴圈,這裡我們只要判斷變數是否i超過了backup.lst備份清單檔總行數,如果是,則表示沒有找到完全備份封裝,所以開始進行完全備份作業

#移除超過保存天數的備份檔
i=1
while [ "$i" -le "`cat "/tmp/backup.lst" | wc -l`" ]
do
backupname=”`sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 6`”
if [ "`date -d $backupname +%s`" -lt "`date -d "$(($reserveday-$fullbackupday)) days ago" +%s`" ]; then
rm “/backup/`sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 9`” 2> “/dev/null” || break
fi
i=$(($i+1))
done
fi
done

在程序運作當中,有時會出現指令是否成功執行或失敗原因等等的訊息,因為我們的程序已經盡可能針對所有情況撰寫了相關判斷,所以考慮美觀因素,我們將這些訊息重新導向到/dev/null這個虛擬裝置檔案
另外,利用date指令取出備份檔案封裝的建立時間,並且與程序一開始所設定的時間作比較,如果資料保存的天數超過了設定的日期,則將該備份封裝檔案移除

PC!ADV
作者

使用 Facebook 留言
發表回應
謹慎發言,尊重彼此。按此展開留言規則