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:\PyCharm\WorkSpace\TestPkg\base\src',r'E:\PyCharm\WorkSpace\TestPkg\base\dest'
- #定时周期执行备份任务
- 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)
python实现对文件的全量、增量备份的更多相关文章
- Python实现目录文件的全量和增量备份
目标: 1.传入3个参数:源文件路径,目标文件路径,md5文件 2.每周一实现全量备份,其余时间增量备份 1.通过传入的路径,获取该路径下面的所有目录和文件(递归) 方法一:使用os.listdir ...
- Xtrabackup全量 增量备份详解
xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份 ...
- mysql全量+增量备份脚本
cat xtrabackup_mysql.sh #!/bin/bash #title :xtrabackup_mysql.sh #description :backup mysql by using ...
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...
- Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录
Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...
- Elasticsearch 索引的全量/增量更新
Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...
- 【MySQL】全量+增量的备份/恢复
生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...
- MySQL自动化(全量+增量)备份脚本
文章转自:http://www.it-hack.cn/forum.php?mod=viewthread&tid=220&extra=page%3D1 一.MySQL的日常备份方案: 全 ...
- Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录
在日常的linux运维工作中,大数据量备份与还原,始终是个难点.关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天这里推荐另一个备份工具innobackupex.innobacku ...
随机推荐
- 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) à ...
- ViewPagerWithRecyclerDemo【RecyclerView+ViewPager实现类似TabLayout+ViewPager效果】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用RecyclerView+ViewPager实现类似TabLayout+ViewPager效果. 效果图 使用步骤 一.项目组织 ...
- 利用Bootstrap Paginator插件和KnockoutJS完成分页功能
在最近一个项目中,需要结合一堆条件查询并对查询的结果数据完成一个简单分页功能,可是做着做着,自己的思路越来越模糊,做到心态崩溃!!! 哈哈,特此花点时间重新总结,并从最简单的分页,然后向多条件查询分页 ...
- java编程行业微信群,无论新手老手欢迎加入,会一直更新
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群
- 强化学习(七)时序差分离线控制算法Q-Learning
在强化学习(六)时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA,而另一类时序差分的离线控制算法还没有讨论,因此本文我们关注于时序差分离线控制算法,主要是经典的Q-Learn ...
- PyCharm:选择性忽略 PEP8 警告
PyCharm 是个很强大的 python IDE,PEP 8 的告警提示也很好用,但是函数名不能包含大写字母等少数几个规范真心觉得不好,作为一名处女座强迫症患者,代码下面的波浪线这种东西是绝对不允许 ...
- [翻译]Mock 在 Python 中的使用介绍
目录 Mock 在 Python 中的使用介绍 原文链接与说明 恐惧系统调用 一个简单的删除函数 使用 Mock 重构 潜在陷阱 向 'rm' 中加入验证 将文件删除作为服务 方法 1:模拟实例的方法 ...
- .net 配置swagger
第一步: 在nuget.org中查找Swashbuckle并下载 在nuget.org中查找Swagger.net.UI,并下载 第二步: 下载完之后,App_Start多了三个文件 Swagger. ...
- Java 合并、拆分PDF文档
处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...
- linux的一些命令,面试经常碰到的
1 查询所有java进程ps -A | grep java解释一下这个命令的意思,ps 是查看系统当前进程的命令,参数 -A(注意,是大写,linux中是区分大小写的)是显示所有程序,| 这个是管道符 ...