zoukankan      html  css  js  c++  java
  • python实现对文件的全量、增量备份

    
    
    #!/user/bin/env python
    # @Time     :2018/6/6 10:10
    # @Author   :PGIDYSQ
    #@File      :FileBackup2.py
    import os
    import filecmp
    import shutil
    import sys
    import time,sched
    '''定时任务备份,增量备份'''
    schedule = sched.scheduler(time.time, time.sleep)
    
    def autoBackup(scrDir,dstDir):
        if((not os.path.isdir(scrDir))or(not os.path.isdir(dstDir))or
               (os.path.abspath(scrDir) != scrDir)or(os.path.abspath(dstDir) != dstDir)):
            usage()
        for item in os.listdir(scrDir):
            scrItem = os.path.join(scrDir,item)
            dstItem= scrItem.replace(scrDir,dstDir)
            if os.path.isdir(scrItem):
                #创建新增加的文件夹,保证目标文件夹结构与原始文件一致
                if not os.path.exists(dstItem):
                    os.makedirs(dstItem)
                    print('make directory'+dstItem)
                #递归调用自身函数
                autoBackup(scrItem,dstItem)
            elif os.path.isfile(scrItem):
                #只复制新增或修改的文件
                if((not os.path.exists(dstItem))or(not filecmp.cmp(scrItem,dstItem,shallow=False))):
                    shutil.copyfile(scrItem,dstItem)
                    print('file:'+scrItem+'==>'+dstItem,os.system('echo %time%'))
        schedule.enter(10, 0, autoBackup, (scrDir, dstDir))
    def usage():
        print('Error')
        print('For example:{0}'.format(sys.argv[0]))
        sys.exit(0)
    if __name__ == "__main__":
        # if len(sys.argv) != 3:
        #     usage()
        # scrDir,dstDir = sys.argv[1],sys.argv[2]
        scrDir, dstDir = r'E:PyCharmWorkSpaceTestPkgasesrc',r'E:PyCharmWorkSpaceTestPkgasedest'
        #定时周期执行备份任务
        schedule.enter(10, 0, autoBackup, (scrDir,dstDir))
        schedule.run()  # 持续运行,直到计划时间队列变成空为止
        #autoBackup(scrDir,dstDir)
    
    
    
    #!/user/bin/env python
    # @Time     :2018/6/6 10:10
    # @Author   :PGIDYSQ
    #@File      :FileBackup.py
    import time
    import os
    import tarfile
    import shutil
    import pickle as p
    import hashlib
    '''实现每周一全量备份,其余时间增量备份'''
    def md5check(fname):
        m = hashlib.md5()
        with open(fname) as fobj:
            while True:
                data = fobj.read(4096)
                if not data:
                    break
                m.update(data.encode())#pay
        return m.hexdigest()
    
    
    def full_backup(src_dir: object, dst_dir, md5file):
        par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
        back_name = '%s_full_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
        full_name = os.path.join(dst_dir, back_name)
        md5dict = {}
    
        # tar = tarfile.open(full_name, 'w:gz')
        # tar.add(src_dir)
        # tar.close()
    
        if os.path.exists(dst_dir):
            shutil.rmtree(dst_dir)
        shutil.copytree(src_dir,dst_dir)#拷贝文件
        #shutil.make_archive(dst_dir,'zip',src_dir)#将文件压缩,注:如果压缩tar,中文文件名有可能乱码
        for path, folders, files in os.walk(src_dir):
            for fname in files:
                full_path = os.path.join(path, fname)
                md5dict[full_path] = md5check(full_path)
    
        if os.path.exists(md5file):
            with open(md5file, 'wb') as f0:
                p.dump(md5dict, f0)
        else:
            with open(md5file,'xb') as f1:
                p.dump(md5dict,f1)
    
    
    def incr_backup(src_dir, dst_dir, md5file):
        par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
        back_name = '%s_incr_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
        full_name = os.path.join(dst_dir, back_name)
        md5new = {}
    
        for path, folders, files in os.walk(src_dir):
            for fname in files:
                full_path = os.path.join(path, fname)
                md5new[full_path] = md5check(full_path)
    
        with open(md5file,'rb') as fobj:
            md5old = p.load(fobj)
    
        with open(md5file, 'wb') as fobj:
            p.dump(md5new, fobj)
    
        #tar = tarfile.open(full_name, 'w:gz')
        for key in md5new:
            if md5old[key] != md5new[key]:
                #tar.add(key)
                shutil.copyfile(key,dst_dir)
        #tar.close()
    
    
    if __name__ == '__main__':
        src_dir = 'base/src'
        dst_dir = 'base/dest/backupfile'
        md5file = 'base/md5.data'
        full_backup(src_dir, dst_dir, md5file)
        # if time.strftime('%a') == 'Mon':
        #     full_backup(src_dir, dst_dir, md5file)
        # else:
        #     incr_backup(src_dir, dst_dir, md5file)
  • 相关阅读:
    SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解
    hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解
    hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解
    HDU6447 网络赛 YJJ's Salesman(DP + 线段树)题解
    HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
    BZOJ 3155 Preprefix sum
    BZOJ 2743 采花
    BZOJ 3339 Rmq Problem
    BZOJ 1660 乱发节
    BZOJ 3531 旅行
  • 原文地址:https://www.cnblogs.com/ysq0908/p/9157380.html
Copyright © 2011-2022 走看看