備份程序

需求說(shuō)明

需要支持完全和增量備份

周一執(zhí)行完全備份

其他時(shí)間執(zhí)行增量備份

備份文件需要打包為tar文件并使用gzip格式壓縮

編程思路

整體框架需要?jiǎng)?chuàng)建3個(gè)函數(shù),分別實(shí)現(xiàn)完全備份通殃、增量備份、文件加密3種功能:

1.首先導(dǎo)入time模塊界睁,利用if進(jìn)行判斷,如果當(dāng)?shù)貢r(shí)間是星期一兵拢,執(zhí)行完全備份函數(shù)翻斟,否則執(zhí)行增量備份函數(shù),其中说铃,通配符%a代表時(shí)間星期幾縮寫访惜,上傳參數(shù)分別為要備份的原目錄、目標(biāo)目錄腻扇、md5字典存放目錄

2.調(diào)用完全備份函數(shù):

a)首先獲取新文件名债热,將新文件名放入目標(biāo)目錄下,目的是定義備份文件的絕對(duì)路徑幼苛,以寫壓縮方式打開目標(biāo)目錄下新文件窒篱,將原目錄寫入新文件中,完成完全備份舶沿,其中os.path.join作用是將目錄名和文件的基名拼接成一個(gè)完整的路徑

b)了解os.walk()目錄遍歷器輸出文件結(jié)構(gòu)墙杯,利用for循環(huán)將要備份原目錄中文件遍歷出來(lái)作為字典鍵值對(duì)鍵, md5加密結(jié)果作為字典鍵值對(duì)的值(此時(shí)將原目錄中文件作為上傳參數(shù)調(diào)用文件加密函數(shù))括荡,存入空字典中高镐,字典中每個(gè)文件對(duì)應(yīng)一個(gè)md5值,最后將字典寫入到md5字典存放目錄中

3.調(diào)用文件加密函數(shù):將原目錄文件循環(huán)讀取逐一加密畸冲,返回加密結(jié)果

4.調(diào)用增量備份函數(shù):

a)增量備份函數(shù)代碼與完全備份函數(shù)基本一致

b)區(qū)別在于嫉髓,備份前要先以二進(jìn)制讀方式打開md5字典存放目錄,讀取舊數(shù)據(jù)召夹,判斷舊數(shù)據(jù)中鍵對(duì)應(yīng)的加密值與新加密值是否相同岩喷,如果不相同,則將新增內(nèi)容寫入到目標(biāo)文件中(即只備份新數(shù)據(jù))

5.注意:md5主要用于原文件與新文件判斷

源代碼

#!/usr/bin/env python3

#導(dǎo)入模塊

import time

import os

import tarfile

import hashlib

import pickle

from time import? strftime

#用于判斷兩個(gè)文件是否相同,提取每個(gè)文件中的前4字節(jié)的內(nèi)容然后輸出md5碼進(jìn)行比較

def check_md5(fname):

? ? #計(jì)算文件md5值的函數(shù),接收文件名,返回md5值

? ? m=hashlib.md5()


? ? with open(fname,'rb') as fobj:

? ? ? ? while True:

? ? ? ? ? ? data = fobj.read(4096)

? ? ? ? ? ? if not data:

? ? ? ? ? ? ? ? break

? ? ? ? ? ? m.update(data)

? ? #返回文件的md5值

? ? return m.hexdigest()

#完全備份

def full_backup(src,dst,md5file):

? ? #拼接出備份文件的絕對(duì)路徑,文件名_full_日期 格式

? ? fname=os.path.basename(src)

? ? fname='%s_full_%s.tar.gz'%(fname,strftime('%Y%m%d'))

? ? fname=os.path.join(dst,fname)

? ? #完全備份,就是把整個(gè)目錄壓縮

? ? # 與增量備份不同,完全備份無(wú)需比較新老文件的md5值,管他是啥直接全部打包

? ? tar=tarfile.open(fname,'w:gz')

? ? tar.add(src)

? ? tar.close()

? ? #計(jì)算每個(gè)文件的md5值

? ? md5dict={}

? ? for path,folders,files in os.walk(src):

? ? ? ? for file in files:

? ? ? ? ? ? key = os.path.join(path,file)

? ? ? ? ? ? md5dict[key]=check_md5(key)

? ? #將md5值寫入文件

? ? with open(md5file,'wb')as fobj:

? ? ? ? pickle.dump(md5dict,fobj)

#增量備份

def incr_backup(src,dst,md5file):

? ? # 拼接出備份文件的絕對(duì)路徑

? ? fname = os.path.basename(src)

? ? fname = '%s_incr_%s.tar.gz' % (fname, strftime('%Y%m%d'))

? ? fname = os.path.join(dst, fname)

? ? # 計(jì)算每個(gè)文件的md5值

? ? md5dict = {}

? ? for path, folders, files in os.walk(src):

? ? ? ? for file in files:

? ? ? ? ? ? key = os.path.join(path, file)

? ? ? ? ? ? md5dict[key] = check_md5(key)

? ? #讀前一天文件的md5值,老的md5值

? ? with open(md5file,'rb')as fobj:

? ? ? ? oldmd5=pickle.load(fobj)

? ? #找出新增文件和改動(dòng)文件進(jìn)行備份

? ? tar = tarfile.open(fname,'w:gz')

? ? for key in md5dict:

? ? ? ? #判斷新老文件的md5值是否相等,不相等則把值加入tar包

? ? ? ? if oldmd5.get(key)!=md5dict[key]:

? ? ? ? ? ? tar.add(key)

? ? tar.close()

# 更新md5文件

? ? with open(md5file, 'wb')as fobj:

? ? ? ? pickle.dump(md5dict, fobj)

if __name__=='__main__':

? ? src='/tmp/demo/security'

? ? dst='/tmp/demo/backup'

? ? md5file='/tmp/demo/backup/md5.data'

? ? if strftime("%a")=='Mon':

? ? ? ? full_backup(src,dst,md5file)

? ? else:

? ? ? ? incr_backup(src,dst,md5file)

功能測(cè)試

mkdir -p /tmp/demo/backup

cp -r /etc/security /tmp/demo/

完全備份

]# python3 備份程序.py

]# cd /var/tmp/backup/

]# ls

md5.data? security_full_20191111.tar.gz

增量備份

]# touch /tmp/demo/security/1.txt

]# vim /tmp/demo/security/1.txt

]# python3 backup.py

]# ls /tmp/demo/backup/

md5.data? security_full_20191111.tar.gz? security_incr_20191111.tar.gz

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末监憎,一起剝皮案震驚了整個(gè)濱河市纱意,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲸阔,老刑警劉巖偷霉,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褐筛,居然都是意外死亡类少,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門渔扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)硫狞,“玉大人,你說(shuō)我怎么就攤上這事〔蟹裕” “怎么了财忽?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泣侮。 經(jīng)常有香客問我即彪,道長(zhǎng),這世上最難降的妖魔是什么活尊? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任隶校,我火速辦了婚禮,結(jié)果婚禮上蛹锰,老公的妹妹穿的比我還像新娘深胳。我一直安慰自己,他們只是感情好宁仔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布稠屠。 她就那樣靜靜地躺著,像睡著了一般翎苫。 火紅的嫁衣襯著肌膚如雪权埠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天煎谍,我揣著相機(jī)與錄音攘蔽,去河邊找鬼。 笑死呐粘,一個(gè)胖子當(dāng)著我的面吹牛满俗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播作岖,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唆垃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了痘儡?” 一聲冷哼從身側(cè)響起辕万,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沉删,沒想到半個(gè)月后渐尿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矾瑰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年砖茸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殴穴。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凉夯,死狀恐怖货葬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劲够,我是刑警寧澤宝惰,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站再沧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尊残。R本人自食惡果不足惜炒瘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寝衫。 院中可真熱鬧顷扩,春花似錦、人聲如沸慰毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)汹胃。三九已至婶芭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間着饥,已是汗流浹背犀农。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宰掉,地道東北人呵哨。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像轨奄,于是被迫代替她去往敵國(guó)和親孟害。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1挪拟、既要可以實(shí)現(xiàn)完全備份挨务,又要實(shí)現(xiàn)增量備份2、完全備份時(shí)舞丛,將目錄打個(gè)tar包耘子,計(jì)算每個(gè)文件的md5值3、增量備份時(shí)...
    凱茜的老爸閱讀 1,774評(píng)論 6 10
  • 同學(xué):在嗎球切,會(huì)寫VBS或JS腳本嗎我:要什么內(nèi)容的正當(dāng)我詫異谷誓,為何同學(xué)有如此一問,要實(shí)現(xiàn)什么功能時(shí)吨凑,他倒挺懂得捍歪,立...
    cnBrave閱讀 1,107評(píng)論 0 0
  • 一户辱、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 此篇文章內(nèi)容是我很久以前在印象筆記中的一個(gè)知識(shí)總結(jié),大概122個(gè)Linux指令糙臼。如今庐镐,寫出來(lái)就當(dāng)再回顧一遍了。若有...
    StephenZhang01閱讀 1,067評(píng)論 0 5
  • Day05的課程要點(diǎn)記錄詳細(xì)教程地址:Day5 - 常用模塊學(xué)習(xí) | 第四篇:模塊 一变逃、模塊介紹 1.1 定義 模...
    乘風(fēng)逐月閱讀 447評(píng)論 0 1