用Python寫(xiě)腳本,實(shí)現(xiàn)完全備份和增量備份的示例
需求:
在/root/backup下面有兩個(gè)文件夾dst和src。要求在周一的時(shí)候進(jìn)行完全備份,其余日子進(jìn)行增量備份。從src備份到dst。
思路及關(guān)鍵點(diǎn):
建立一個(gè)文件,以字典方式記錄src的文件名以及文件對(duì)應(yīng)的md5的值
完全備份的時(shí)候?qū)⑽募蚼d5值寫(xiě)在一個(gè)文件里面。cPickle的知識(shí)點(diǎn)。
增量備份的時(shí)候比較文件名是否在key里面,沒(méi)有就要備份;有的話,這個(gè)文件的md5值是否改變,改變了就要備份
os.path.join()拼接路徑,os.listdir(),os.chdir()
time.strftime()判斷周幾
cPickle,可以無(wú)損記錄所有Python的變量類(lèi)型。文件操作。
tarfile對(duì)文件打包的使用
hashlib用于計(jì)算文件md5的值。注意不要一次打開(kāi)一個(gè)文件,4k地打開(kāi),防止打開(kāi)一個(gè)超大文件爆內(nèi)存。
with file()可以打開(kāi)一個(gè)文件之后不f.close()
#!/usr/bin/env python import time import os import cPickle as p import tarfile import hashlib baseDir = '/root/backup' srcDir = 'src' dstDir = 'dst' fullName = "full_%s_%s.tar.gz" % (srcDir, time.strftime('%Y%m%d')) incrName = "incr_%s_%s.tar.gz" % (srcDir, time.strftime('%Y%m%d')) md5file = 'md5.data' def md5sum(fname): m = hashlib.md5() with file(fname) as f: while True: data = f.read(4096) if len(data) == 0: break m.update(data) return m.hexdigest() def fullBackup(): md5Dict = {} fileList = os.listdir(os.path.join(baseDir,srcDir)) for eachFile in fileList: md5Dict[eachFile] = md5sum(os.path.join(baseDir,srcDir,eachFile)) with file(os.path.join(baseDir,dstDir,md5file),'w') as f: p.dump(md5Dict,f) tar = tarfile.open(os.path.join(baseDir,dstDir,fullName),'w:gz') os.chdir(baseDir) tar.add(srcDir) tar.close() def incrBackup(): newmd5 = {} fileList = os.listdir(os.path.join(baseDir,srcDir)) for eachFile in fileList: newmd5[eachFile] = md5sum(os.path.join(baseDir,srcDir,eachFile)) with file(os.path.join(baseDir,dstDir,md5file)) as f: storedmd5 = p.load(f) tar = tarfile.open(os.path.join(baseDir,dstDir,incrName),'w:gz') os.chdir(baseDir) for eachKey in newmd5: if (eachKey not in storedmd5) or (newmd5[eachKey] != storedmd5[eachKey]): tar.add(os.path.join(srcDir,eachKey)) tar.close() with file(os.path.join(baseDir,dstDir,md5file),'w') as f: p.dump(newmd5,f) def main(): if time.strftime('%a') == 'Mon': fullBackup() else: incrBackup() if __name__ == '__main__': main() ~
以上這篇用Python寫(xiě)腳本,實(shí)現(xiàn)完全備份和增量備份的示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Django實(shí)現(xiàn)drf搜索過(guò)濾和排序過(guò)濾
當(dāng)我們需要對(duì)后臺(tái)的數(shù)據(jù)進(jìn)行過(guò)濾的時(shí)候,drf有兩種,搜索過(guò)濾和排序過(guò)濾。本文就詳細(xì)的介紹這兩種的實(shí)現(xiàn),感興趣的可以了解一下2021-06-06Python中利用mpld3創(chuàng)建交互式Matplotlib圖表的代碼示例
mpld3 是一個(gè) Python 庫(kù),它將 Matplotlib 圖表轉(zhuǎn)換為 D3.js(JavaScript 繪圖庫(kù))可解釋的格式,從而實(shí)現(xiàn)了在瀏覽器中顯示并交互的功能,在本文中,我們將介紹如何使用 mpld3 在 Python 中創(chuàng)建交互式 Matplotlib 圖表,并提供代碼示例,需要的朋友可以參考下2024-05-05flask后端request獲取參數(shù)的幾種方式整理
這篇文章主要為大家介紹了flask后端request獲取參數(shù)的幾種方式整理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python3 實(shí)現(xiàn)函數(shù)寫(xiě)文件路徑的正確方法
今天小編就為大家分享一篇python3 實(shí)現(xiàn)函數(shù)寫(xiě)文件路徑的正確方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Transformer導(dǎo)論之Bert預(yù)訓(xùn)練語(yǔ)言解析
這篇文章主要為大家介紹了Transformer導(dǎo)論之Bert預(yù)訓(xùn)練語(yǔ)言解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Python實(shí)現(xiàn)的爬蟲(chóng)功能代碼
這篇文章主要介紹了Python實(shí)現(xiàn)的爬蟲(chóng)功能,涉及Python使用urllib2、BeautifulSoup模塊實(shí)現(xiàn)網(wǎng)頁(yè)源碼的獲取、解析等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06