基于python的指定文件的完全备份和增量备份

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学习路上的一个前行者,上述代码希望能帮到各位,如有不足,欢迎指正!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值