Linux自動備份腳本

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1541163

       今天網上一個朋友問了我一個shell的題目,讓我幫他做下。下面是題目以及解題思路。


題目:

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


OK!本文到此結束,希望能對51博友有所幫助!

轉自:http://nolinux.blog.51cto.com/4824967/1541163

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/1949

(0)
s19930811s19930811
上一篇 2016-08-15 12:12
下一篇 2016-08-15 12:12

相關推薦

  • 馬哥教育網絡班20期+第2周課程練習

    馬哥教育網絡班20期+第2周課程練習 練習題: 1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。2、bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。3、請使用命令行展開功能來完成以下練習:   (1)、創建/tmp目錄下的:a_c, a_d, b_c, b_d  …

    Linux干貨 2016-06-23
  • 初識shell腳本編程

    shell的編程三種分類方式介紹,如何使用nano命令編寫一個腳本命令,及腳本命令運行的2種方式。bash的配置文件及系統啟動時加載配置文件的順序流程

    2017-12-14
  • Linux基礎(九)-shell編程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash declare -i nologin=0 declare -i login=0 while read l…

    Linux干貨 2016-11-20
  • oracle6.7使用udev作為asm

    1、需求 oracle6.7使用udev作為asm /dev/sdb <–> /dev/asm-diskb /dev/sdc <–> /dev/asm-diskc /dev/sdd <–> /dev/asm-diskd /dev/sde <–> /dev/asm-…

    Linux干貨 2016-07-29
  • 基礎指令的使用篇3 Linux版

    / /boot /bin /sbin /lib.modules /lib64 /etc/redhat-release /etc/centos-release /home/zczx /mnt /media /misc /proc/meminfo /proc/cpuinfo /proc/partition /sya /opt /tmp /usr/local/ /…

    Linux干貨 2016-08-04
  • ![](http://i1.pixiv.net/img-original/img/2016/08/09/20/23/25/58345400_p0.jpg) ![](http://i1.pixiv.net/img-original/img/2016/08/09/20/23/25/58345400_p0.jpg)

    Linux干貨 2016-12-26
欧美性久久久久