1.  
  1. #!/user/bin/env python
  2. # @Time :2018/6/6 10:10
  3. # @Author :PGIDYSQ
  4. #@File :FileBackup2.py
  5. import os
  6. import filecmp
  7. import shutil
  8. import sys
  9. import time,sched
  10. '''定时任务备份,增量备份'''
  11. schedule = sched.scheduler(time.time, time.sleep)
  12.  
  13. def autoBackup(scrDir,dstDir):
  14. if((not os.path.isdir(scrDir))or(not os.path.isdir(dstDir))or
  15. (os.path.abspath(scrDir) != scrDir)or(os.path.abspath(dstDir) != dstDir)):
  16. usage()
  17. for item in os.listdir(scrDir):
  18. scrItem = os.path.join(scrDir,item)
  19. dstItem= scrItem.replace(scrDir,dstDir)
  20. if os.path.isdir(scrItem):
  21. #创建新增加的文件夹,保证目标文件夹结构与原始文件一致
  22. if not os.path.exists(dstItem):
  23. os.makedirs(dstItem)
  24. print('make directory'+dstItem)
  25. #递归调用自身函数
  26. autoBackup(scrItem,dstItem)
  27. elif os.path.isfile(scrItem):
  28. #只复制新增或修改的文件
  29. if((not os.path.exists(dstItem))or(not filecmp.cmp(scrItem,dstItem,shallow=False))):
  30. shutil.copyfile(scrItem,dstItem)
  31. print('file:'+scrItem+'==>'+dstItem,os.system('echo %time%'))
  32. schedule.enter(10, 0, autoBackup, (scrDir, dstDir))
  33. def usage():
  34. print('Error')
  35. print('For example:{0}'.format(sys.argv[0]))
  36. sys.exit(0)
  37. if __name__ == "__main__":
  38. # if len(sys.argv) != 3:
  39. # usage()
  40. # scrDir,dstDir = sys.argv[1],sys.argv[2]
  41. scrDir, dstDir = r'E:\PyCharm\WorkSpace\TestPkg\base\src',r'E:\PyCharm\WorkSpace\TestPkg\base\dest'
  42. #定时周期执行备份任务
  43. schedule.enter(10, 0, autoBackup, (scrDir,dstDir))
  44. schedule.run() # 持续运行,直到计划时间队列变成空为止
  45. #autoBackup(scrDir,dstDir)
  1.  
  1. #!/user/bin/env python
  2. # @Time :2018/6/6 10:10
  3. # @Author :PGIDYSQ
  4. #@File :FileBackup.py
  5. import time
  6. import os
  7. import tarfile
  8. import shutil
  9. import pickle as p
  10. import hashlib
  11. '''实现每周一全量备份,其余时间增量备份'''
  12. def md5check(fname):
  13. m = hashlib.md5()
  14. with open(fname) as fobj:
  15. while True:
  16. data = fobj.read(4096)
  17. if not data:
  18. break
  19. m.update(data.encode())#pay
  20. return m.hexdigest()
  21.  
  22. def full_backup(src_dir: object, dst_dir, md5file):
  23. par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
  24. back_name = '%s_full_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
  25. full_name = os.path.join(dst_dir, back_name)
  26. md5dict = {}
  27.  
  28. # tar = tarfile.open(full_name, 'w:gz')
  29. # tar.add(src_dir)
  30. # tar.close()
  31.  
  32. if os.path.exists(dst_dir):
  33. shutil.rmtree(dst_dir)
  34. shutil.copytree(src_dir,dst_dir)#拷贝文件
  35. #shutil.make_archive(dst_dir,'zip',src_dir)#将文件压缩,注:如果压缩tar,中文文件名有可能乱码
  36. for path, folders, files in os.walk(src_dir):
  37. for fname in files:
  38. full_path = os.path.join(path, fname)
  39. md5dict[full_path] = md5check(full_path)
  40.  
  41. if os.path.exists(md5file):
  42. with open(md5file, 'wb') as f0:
  43. p.dump(md5dict, f0)
  44. else:
  45. with open(md5file,'xb') as f1:
  46. p.dump(md5dict,f1)
  47.  
  48. def incr_backup(src_dir, dst_dir, md5file):
  49. par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
  50. back_name = '%s_incr_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
  51. full_name = os.path.join(dst_dir, back_name)
  52. md5new = {}
  53.  
  54. for path, folders, files in os.walk(src_dir):
  55. for fname in files:
  56. full_path = os.path.join(path, fname)
  57. md5new[full_path] = md5check(full_path)
  58.  
  59. with open(md5file,'rb') as fobj:
  60. md5old = p.load(fobj)
  61.  
  62. with open(md5file, 'wb') as fobj:
  63. p.dump(md5new, fobj)
  64.  
  65. #tar = tarfile.open(full_name, 'w:gz')
  66. for key in md5new:
  67. if md5old[key] != md5new[key]:
  68. #tar.add(key)
  69. shutil.copyfile(key,dst_dir)
  70. #tar.close()
  71.  
  72. if __name__ == '__main__':
  73. src_dir = 'base/src'
  74. dst_dir = 'base/dest/backupfile'
  75. md5file = 'base/md5.data'
  76. full_backup(src_dir, dst_dir, md5file)
  77. # if time.strftime('%a') == 'Mon':
  78. # full_backup(src_dir, dst_dir, md5file)
  79. # else:
  80. # incr_backup(src_dir, dst_dir, md5file)

python实现对文件的全量、增量备份的更多相关文章

  1. Python实现目录文件的全量和增量备份

    目标: 1.传入3个参数:源文件路径,目标文件路径,md5文件 2.每周一实现全量备份,其余时间增量备份 1.通过传入的路径,获取该路径下面的所有目录和文件(递归) 方法一:使用os.listdir ...

  2. Xtrabackup全量 增量备份详解

    xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份 ...

  3. mysql全量+增量备份脚本

    cat xtrabackup_mysql.sh #!/bin/bash #title :xtrabackup_mysql.sh #description :backup mysql by using ...

  4. Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...

  5. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  6. Elasticsearch 索引的全量/增量更新

    Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...

  7. 【MySQL】全量+增量的备份/恢复

    生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...

  8. MySQL自动化(全量+增量)备份脚本

    文章转自:http://www.it-hack.cn/forum.php?mod=viewthread&tid=220&extra=page%3D1 一.MySQL的日常备份方案: 全 ...

  9. Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录

    在日常的linux运维工作中,大数据量备份与还原,始终是个难点.关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天这里推荐另一个备份工具innobackupex.innobacku ...

随机推荐

  1. java SE Development kit 8 Update 201 (64-bit) 的安装相关

    登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型   1.6(JDK6.0) à ...

  2. ViewPagerWithRecyclerDemo【RecyclerView+ViewPager实现类似TabLayout+ViewPager效果】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用RecyclerView+ViewPager实现类似TabLayout+ViewPager效果. 效果图 使用步骤 一.项目组织 ...

  3. 利用Bootstrap Paginator插件和KnockoutJS完成分页功能

    在最近一个项目中,需要结合一堆条件查询并对查询的结果数据完成一个简单分页功能,可是做着做着,自己的思路越来越模糊,做到心态崩溃!!! 哈哈,特此花点时间重新总结,并从最简单的分页,然后向多条件查询分页 ...

  4. java编程行业微信群,无论新手老手欢迎加入,会一直更新

    纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群

  5. 强化学习(七)时序差分离线控制算法Q-Learning

    在强化学习(六)时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA,而另一类时序差分的离线控制算法还没有讨论,因此本文我们关注于时序差分离线控制算法,主要是经典的Q-Learn ...

  6. PyCharm:选择性忽略 PEP8 警告

    PyCharm 是个很强大的 python IDE,PEP 8 的告警提示也很好用,但是函数名不能包含大写字母等少数几个规范真心觉得不好,作为一名处女座强迫症患者,代码下面的波浪线这种东西是绝对不允许 ...

  7. [翻译]Mock 在 Python 中的使用介绍

    目录 Mock 在 Python 中的使用介绍 原文链接与说明 恐惧系统调用 一个简单的删除函数 使用 Mock 重构 潜在陷阱 向 'rm' 中加入验证 将文件删除作为服务 方法 1:模拟实例的方法 ...

  8. .net 配置swagger

    第一步: 在nuget.org中查找Swashbuckle并下载 在nuget.org中查找Swagger.net.UI,并下载 第二步: 下载完之后,App_Start多了三个文件 Swagger. ...

  9. Java 合并、拆分PDF文档

    处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...

  10. linux的一些命令,面试经常碰到的

    1 查询所有java进程ps -A | grep java解释一下这个命令的意思,ps 是查看系统当前进程的命令,参数 -A(注意,是大写,linux中是区分大小写的)是显示所有程序,| 这个是管道符 ...