加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

【Python】用Python写脚本,完全备份和增量备份

发布时间:2020-12-17 01:22:11 所属栏目:Python 来源:网络整理
导读:需求:? 在/root/backup下面有两个文件夹dst和src。要求在周一的时候进行完全备份,其余日子进行增量备份。从src备份到dst。 思路及关键点:建立一个文件,以字典方式记录src的文件名以及文件对应的md5的值 完全备份的时候将文件名和md5值写在一个文件里面。

需求:?
在/root/backup下面有两个文件夹dst和src。要求在周一的时候进行完全备份,其余日子进行增量备份。从src备份到dst。

思路及关键点:建立一个文件,以字典方式记录src的文件名以及文件对应的md5的值
完全备份的时候将文件名和md5值写在一个文件里面。cPickle的知识点。
增量备份的时候比较文件名是否在key里面,没有就要备份;有的话,这个文件的md5值是否改变,改变了就要备份
os.path.join()拼接路径,os.listdir(),os.chdir()
time.strftime()判断周几
cPickle,可以无损记录所有Python的变量类型。文件操作。
tarfile对文件打包的使用
hashlib用于计算文件md5的值。注意不要一次打开一个文件,4k地打开,防止打开一个超大文件爆内存。
with file()可以打开一个文件之后不f.close()

<pre class="has">
#!/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,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,eachFile))
? ? with file(os.path.join(baseDir,md5file)) as f:
? ? ? ? storedmd5 = p.load(f)

? ? tar = tarfile.open(os.path.join(baseDir,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,'w') as f:
? ? ? ? p.dump(newmd5,f)

def main():
? ? if time.strftime('%a') == 'Mon':
? ? ? ? fullBackup()
? ? else:
? ? ? ? incrBackup()

if name == 'main':
? ? main()

~ ??


---------------------?
作者:huangyingleo?
来源:CSDN?
原文:https://blog.csdn.net/huangyingleo/article/details/55002230?
版权声明:本文为博主原创文章,转载请附上博文链接!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读