#!/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实现对文件的全量、增量备份的更多相关文章

  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. 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二八║ Nuxt 基础:面向源码研究Nuxt.js

    前言 哈喽大家周五好,又是一个开开心心的周五了,接下来就是三天小团圆啦,这里先祝大家节日快乐咯,希望都没有加班哈哈,今天公司发了月饼,嗯~时间来不及了,上周应该搞个活动抽中几个粉丝发月饼的,下次吧,这 ...

  2. Java实现单链表

    真正的动态数据结构(引用和指针) 优点:真正的动态,不需要处理固定容量的问题. 缺点:丧失随机访问的能力. 链表就像寻宝,我们拿到藏宝图开始出发寻宝,每找到一个地方后,里面藏着下一步应该去哪里寻找.一 ...

  3. python接口自动化(一)--什么是接口、接口优势、类型(详解)

    简介 经常听别人说接口测试,接口测试自动化,但是你对接口,有多少了解和认识,知道什么是接口吗?它是用来做什么的,测试时候要注意什么?坦白的说,笔者之前也不是很清楚.接下来先看一下接口的定义. 定义 接 ...

  4. 解决关于:Oracle数据库 插入数据中文乱码 显示问号???

    问题: oracle数据库,通过接口插入的中文数据乱码,中文变成了问号??? 解决方案: 计算机=>属性=>高级系统设置=>环境变量=>新建 变量名:NLS_LANG 值:SI ...

  5. ResDrawableImgUtil【根据图片名称获取resID值或者Bitmap对象】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 根据图片名称获取项目的res/drawable-xxdhpi中相应资源的ID值以及bitmap值的封装类. 效果图 代码分析 根据图 ...

  6. FragmentTabHostAutoDemo【FragmentTabHost可滑动的选项卡】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(可滑动的效果)展现. 效果图 代码分析 1.该Demo中采用的是FragmentT ...

  7. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  8. LeetCode 上最难的链表算法题,没有之一!

    题目来源于 LeetCode 第 23 号问题:合并 K 个排序链表. 该题在 LeetCode 官网上有关于链表的问题中标注为最难的一道题目:难度为 Hard ,通过率在链表 Hard 级别目前最低 ...

  9. DSAPI Wifi热点的扫描与连接

    使用DSAPI扫描和连接Wifi热点,支持连接隐藏的SSID. 效果演示: 代码如下: Private Wifi As New DSAPI.网络.Wifi Private Sub Button1_Cl ...

  10. 前端零基础 --css转换--skew斜切变形 transfor 3d

    前端零基础 --css转换--skew斜切变形 transfor 3d==============重要不紧急! 重要紧急 重要不紧急 不重要紧急 不重要不紧急