项目需求:利用python3脚本实现每周一对数据文件完全备份,其他时间只增量备份

import time
import os
import hashlib
import tarfile
import pickle

def check_md5(fname):
    '计算每个文件MD5值'
    m = hashlib.md5()
    with open(fname,'rb') as fobj:
        while 1:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)
    return m.hexdigest()

def full_back(src,dst,md5):
    '数据完全备份'
    '备份文件名'
    fn = '%s_funll_%s.gz' \
            %(os.path.basename(src),time.strftime("%Y%m%d"))
    fname = os.path.join(dst,fn)
    'tar实行备份'
    tar = tarfile.open(fname,'w:gz')
    tar.add(src)
    tar.close()
    '获取文件md5值,保存在MD5文件'
    md5dict = {}
    for paths,folders,files in os.walk(src):
        for file in files:
            key = os.path.join(paths,file)
            md5dict[key] = check_md5(key)
    with open(md5,'wb') as fobj:
        pickle.dump(md5dict,fobj)

def inc_back(src,dst,md5):
    #'数据增量备份'
    #'备份文件名'
    fn = '%s_inc_%s.gz' \
         % (os.path.basename(src), time.strftime("%Y%m%d"))
    fname = os.path.join(dst, fn)
    #'读取前一天MD5值'
    with open(md5, 'rb')as fobj:
        old_dict = pickle.load(fobj)
    #'获取当前文件MD5值'
    md5dict = {}
    for paths, folders, files in os.walk(src):
        for file in files:
            key = os.path.join(paths, file)
            md5dict[key] = check_md5(key)
            #'找出更改及新曾文件实行备份'
    tar = tarfile.open(fname,'w:gz')
    for key in md5dict:
        #if fname not in old_dict or  md5dict[fname] != old_md5[fname]
        if old_dict.get(key) != md5dict[key]:
            tar.add(key)
    tar.close()
       #'更新md5值'
    with open(md5, 'wb') as fobj:
        pickle.dump(md5dict, fobj)
if __name__ == '__main__':
    src = '/mylibs/security'
    dst = '/mylibs/backup'
    md5 = '/mylibs/md5.data'
    if (time.strftime('%a') == 'Mon') or not (os.path.exists(md5)):
        full_back(src,dst,md5)
    inc_back(src,dst,md5)

Guess you like

Origin blog.csdn.net/weixin_38642722/article/details/121525318