from time import strftime
import os
import tarfile
import hashlib
import pickle
# 需求:每周固定时间进行完全备份,其余时间进行增量备份
# 思路说明:
# 1.主要分3个功能模块:完全备份功能/增量备份功能/md5值计算功能
# 2.完全备份:
# 2.1实现指定目录的完全tar包备份
# 2.2记录当前目录下所有文件的md5值到指定的文件,为后续做增量备份提供md5值参考
# 3.增量备份:
# 3.1计算当天指定目录下所有文件的md5值
# 3.2根据当天计算的md5值和前一天留下的md5值作比较,判断哪些文件发生改变
# 3.3将发生改变的文件备份到指定目录
# 3.4保存当天计算的MD5值覆盖前一天的MD5值文件
# 4.主函数指定需要备份的目录,指定完全备份和增量备份的时间,这里也可以将其功能进行拆分,做函数调用
# 计算文件的md5值
def check_md5(fname):
# 计算文件MD5值的函数,接受文件名,返回md5值
m = hashlib.md5()
with open(fname,'rb')as fobj:
while True:
date = fobj.read(4096)
if not date:
break
m.update(date)
return m.hexdigest()
# 完全备份
def full_backup(src,dst,md5file):
# 拼接出备份的文件名
fname = os.path.basename(src)
fname = '%s_full_%s.tar.gz' % (fname,strftime('%Y%m%d'))
fname = os.path.join(dst,fname)
# 完全备份,就是把整个目录压缩
tar = tarfile.open(fname,'w:gz')
tar.add(src)
tar.close()
# 计算每个文件的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):
# 拼接出备份的文件名
fname = os.path.basename(src)
fname = '%s_incr_%s.tar.gz' % (fname, strftime('%Y%m%d'))
fname = os.path.join(dst, fname)
# 计算每个文件的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,'rb') as fobj:
old_md5 = pickle.load(fobj)
# 找出新增文件和改动文件进行备份
tar = tarfile.open(fname,'w:gz')
for key in md5dict:
if md5dict[key] != old_md5.get(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' # 指定md5值存储的文件
if strftime('%a') != 'Mon': # 周一做完全备份,其余做增量备份
full_backup(src,dst,md5file)
else:
incr_backup(src,dst,md5file)
目前是Python学习路上的一个前行者,上述代码希望能帮到各位,如有不足,欢迎指正!!