文件周一完全备份其他增量备份


import hashlib, os, tarfile, pickle

from time import strftime

def check_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_{strftime("%Y%m%d")}.tar.gz'

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

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

        tar.add(src)

    md5dict = {}

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

        for file in files:

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

            md5dict[key] = check_md5(key)

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

        pickle.dump(md5dict, fobj)

def incr_backup(src, dst, md5file):

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

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

    md5dict = {}

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

        for file in files:

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

            md5dict[key] = check_md5(key)

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

        old_md5 = pickle.load(fobj)

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

        for key in md5dict:

            if old_md5.get(key) != md5dict[key]:

                tar.add(key)

    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'

    # 如果是周一,或者从来没有备份过,则进行完全备份

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

        full_backup(src, dst, md5file)

    else:

        incr_backup(src, dst, md5file)

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

推荐阅读更多精彩内容