目标:

  1.传入3个参数:源文件路径,目标文件路径,md5文件

  2.每周一实现全量备份,其余时间增量备份

1.通过传入的路径,获取该路径下面的所有目录和文件(递归)

方法一:使用os.listdir

代码如下:

#!/usr/bin/env python
#coding:utf8 import os,sys def lsdir(folder):
contents = os.listdir(folder)
print "%s\n%s\n" % (folder, contents)
for path in contents:
full_path = os.path.join(folder, path)
if os.path.isdir(full_path):
lsdir(full_path) if __name__ == "__main__":
lsdir(sys.argv[1])

•运行代码,效果如下:

[root@localhost python]# python listdir.py /a
/a
['b', 'a.txt'] /a/b
['c', 'b.txt'] /a/b/c
['c.txt']

方法二:使用os.walk

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*- import os,sys def lsdir(folder):
contents = os.walk(folder)
for path, folder, file in contents:
print "%s\n%s\n" %(path, folder + file) if __name__ == "__main__":
lsdir(sys.argv[1])

•运行代码,测试效果

[root@localhost python]# python listdir1.py /a
/a
['b', 'a.txt'] /a/b
['c', 'b.txt'] /a/b/c
['c.txt']

2.如何计算文件的md5值(每次读取4K,直到读取完文件所有内容,返回一个16进制的md5值)

代码如下:

[root@localhost python]# cat md5.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- import hashlib
import sys def md5(fname):
m = hashlib.md5()
with open(fname) as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest() if __name__ == "__main__":
print md5(sys.argv[1])

•运行代码,测试效果

[root@localhost python]# python md5.py a.txt
c33da92372e700f98b006dfa5325cf0d
[root@localhost python]# md5sum a.txt
c33da92372e700f98b006dfa5325cf0d a.txt

*提示:使用linux自带的md5sum和自己编写的Python计算的md5值相通

3.编写全量和增量备份脚本

代码如下:

#!/usr/bin/env python
#coding:utf8 import time
import os
import tarfile
import cPickle 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)
return m.hexdigest() def full_backup(src_dir, 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()
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) with open(md5file, 'w') as fobj:
p.dump(md5dict, fobj) 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) as fobj:
md5old = p.load(fobj) with open(md5file, 'w') as fobj:
p.dump(md5new, fobj) tar = tarfile.open(full_name, 'w:gz')
for key in md5new:
if md5old.get(key) != md5new[key]:
tar.add(key)
tar.close() if __name__ == '__main__':
src_dir = '/Users/xkops/gxb/'
dst_dir = '/tmp/'
md5file = '/Users/xkops/md5.data'
if time.strftime('%a') == 'Mon':
full_backup(src_dir, dst_dir, md5file)
else:
incr_backup(src_dir, dst_dir, md5file)

•运行代码,测试效果(执行前,修改需要备份的文件和路径),运行之后检查/tmp下是否生成了当天的备份文件。

Python实现目录文件的全量和增量备份的更多相关文章

  1. python实现对文件的全量、增量备份

    #!/user/bin/env python # @Time :2018/6/6 10:10 # @Author :PGIDYSQ #@File :FileBackup2.py import os i ...

  2. MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出

    粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损 ...

  3. mysql全量和增量备份详解(带脚本)

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 下面对这种备份方案详细说明下:1.MySQLdump增量备份配置执行增量备份的前提条件是M ...

  4. oracle全量、增量备份

    采用0221222增量备份策略,7天一个轮回 也就是周日0级备份,周1 2 4 5 6 采用2级增量备份,周3采用1级增量备份 打开控制文件自动备份 CONFIGURE CONTROLFILE AUT ...

  5. innobackupex在线备份及恢复(全量和增量)

    Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品.Xtrabackup由个部分组成:xtrabackup和innob ...

  6. 关于Subversion主从备份方式的调整(全量、增量脚本)更新

    本文引用于http://blog.chinaunix.net/uid-25266990-id-3369172.html 之前对Subversion服务器作了迁移,关于SVN的架构也走了调整,有单一的服 ...

  7. Mysql备份工具xtraback全量和增量测试

    Mysql备份工具xtraback全量和增量测试   xtrabackup 是 percona 的一个开源项目,可以热备份innodb ,XtraDB,和MyISAM(会锁表) 官方网址http:// ...

  8. MySQL数据以全量和增量方式,同步到ES搜索引擎

    本文源码:GitHub·点这里 || GitEE·点这里 一.配置详解 场景描述:MySQL数据表以全量和增量的方式向ElasticSearch搜索引擎同步. 1.下载内容 elasticsearch ...

  9. 全量、增量数据在HBase迁移的多种技巧实践

    作者经历了多次基于HBase实现全量与增量数据的迁移测试,总结了在使用HBase进行数据迁移的多种实践,本文针对全量与增量数据迁移的场景不同,提供了1+2的技巧分享. HBase全量与增量数据迁移的方 ...

随机推荐

  1. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  2. wordpress上传文件,插件无法建立目录(根本原因解决)

    刚建立的wp网站经常遇到上传图片或者下载插件“无法建立目录”的问题,肯定是权限的问题,网上大部分解决方案都是把uploads或者 plugins权限手动改成777, 有一部分人成功了,有一部分没成功, ...

  3. springboot上传下载文件

    在yml配置相关内容 spring: # mvc: throw-exception-if-no-handler-found: true #静态资源 static-path-pattern: /** r ...

  4. ecmall页面空白解决方案(转)

    页面空白解决方案: ------------------------------------------------------------------------------------------ ...

  5. HTML第一讲

    HTML标记区分 HTML即超文本标记语言(HtyperText Markup Language),其作用就是将编辑的内容在屏幕上显示.文件的后缀为.HTML. 在HTML中成对出现的叫做双标记(譬如 ...

  6. Jquery each循环中中断

    在each代码块内不能使用break和continue,要实现break和continue的功能的话,要使用其它的方式 break----用return false; continue --用retu ...

  7. Java-Runoob:Java 日期时间

    ylbtech-Java-Runoob:Java 日期时间 1.返回顶部 1. Java 日期时间 java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实 ...

  8. C++模板类练习题

    题目说明: 编写一个程序,使用类模板对数组元素进行排序,倒置.查找和求和 具有对数组元素进行排序,倒置.查找和求和功能, 然后产生类型实参分别为int型和double型的两个模板类, 分别对整型数组与 ...

  9. 使用java获取自己的机器网卡

    package org.ibase4j.core.util; import java.io.BufferedReader;import java.io.IOException;import java. ...

  10. 如何利用R包qqman画曼哈顿图?

    如何利用R包qqman画曼哈顿图? 2017-07-10 lili 生信人 众多周知,R语言提供了各种各样的包,方便实现我们的目的,下面给大家介绍一个可以便捷的画曼哈顿图的包:qqman instal ...