Python小例-11-全量与增量备份文件

1-1
1-2
1-3
1-4

import tarfile

import time

import hashlib

import pickle

import os

def hash_md5(fname):

    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_backup(src,dst,md5file):

    '全备份'

    # 拼接出备份文件的文件名

    fname = f'{os.path.basename(src)}_full_{time.strftime("%Y-%m-%d")}.tar.gz'

    fname = os.path.join(dst,fname)

    #备份,打tar包

    with tarfile.open(fname, 'w:gz') as tar:

        tar.add(src)

    # 计算当前文件的md5值

    md5dir = {}

    for path,folders,files in os.walk(src):

        for file in files:

            key = os.path.join(path,file)

            md5dir[key] = hash_md5(key)

    # 保存md5字典到md5file

    with open(md5file,'wb') as fobj:

        pickle.dump(md5dir,fobj)

def incre_backup(src,dst,md5file):

    '增量备份'

    # 拼接出备份文件的文件名

    fname = f'{os.path.basename(src)}_incre_{time.strftime("%Y-%m-%d")}.tar.gz'

    fname = os.path.join(dst, fname)

    # 计算当前文件的md5值

    md5dir = {}

    for path,folders,files in os.walk(src):

        for file in files:

            key = os.path.join(path,file)

            md5dir[key] = hash_md5(key)

    # 取出前一天的md5值

    with open (md5file,'rb') as fobj:

        old_md5 = pickle.load(fobj)

    # 备份新文件和改动的文件

    with tarfile.open(fname,'w:gz') as tar:

        for key in md5dir:

            if old_md5 != md5dir[key]:

                tar.add(key)

    # 更新md5文件

    with open(md5file,'wb') as fobj:

        pickle.dump(md5dir,fobj)

if __name__ == '__main__':

    src = '/tmp/demo/security' #自定义

    dst = '/tmp/demo/backup' #自定义

    md5file = '/tmp/demo/backup/md5.data'#自定义

    #周一全备,其他增量备

    if (time.strftime('%a') == 'Mon') or (not os.path.exists(md5file)):

        full_backup(src,dst,md5file)

    else:

        incre_backup(src,dst,md5file)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容