目标:
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实现对文件的全量、增量备份
#!/user/bin/env python # @Time :2018/6/6 10:10 # @Author :PGIDYSQ #@File :FileBackup2.py import os i ...
MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出
粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损 ...
mysql全量和增量备份详解(带脚本)
在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 下面对这种备份方案详细说明下:1.MySQLdump增量备份配置执行增量备份的前提条件是M ...
oracle全量、增量备份
采用0221222增量备份策略,7天一个轮回 也就是周日0级备份,周1 2 4 5 6 采用2级增量备份,周3采用1级增量备份 打开控制文件自动备份 CONFIGURE CONTROLFILE AUT ...
innobackupex在线备份及恢复(全量和增量)
Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品.Xtrabackup由个部分组成:xtrabackup和innob ...
关于Subversion主从备份方式的调整(全量、增量脚本)更新
本文引用于http://blog.chinaunix.net/uid-25266990-id-3369172.html 之前对Subversion服务器作了迁移,关于SVN的架构也走了调整,有单一的服 ...
Mysql备份工具xtraback全量和增量测试
Mysql备份工具xtraback全量和增量测试 xtrabackup 是 percona 的一个开源项目,可以热备份innodb ,XtraDB,和MyISAM(会锁表) 官方网址http:// ...
MySQL数据以全量和增量方式,同步到ES搜索引擎
本文源码:GitHub·点这里 || GitEE·点这里 一.配置详解 场景描述:MySQL数据表以全量和增量的方式向ElasticSearch搜索引擎同步. 1.下载内容 elasticsearch ...
python模块目录文件后续
1,新增PythonModule加载path Ruiy tip(关于python list[]数据库类型特殊你懂的!append(""),extend([""] ...
随机推荐
stm32 usb error : identifier ";bool"; is undefined
.\usb\USB\usb_pwr.h(54): error: #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): ...
解决Android SDK Content Loader 0%的问题
在Android的开发过程中,应该说大多数人都遇到过此问题. 具体原因不得而知,在workspace中导入了太多的工程可能是其中一个原因. 网上有很多针对此问题的解决方法,对于我自己而言,下面两个方法 ...
findByExample(Object exampleEntity)方法得到的List判断是否为空,不可用(lis != null)
用findByExample(Object exampleEntity)方法可以应用在用户登录上面,获得有登陆名和密码的user对象进行查询. 返回两者都符合的对象列表,为空则登陆失败. 错误的方法: ...
NuGet更新引用Dll
第一种 通过 "Add Library Package Reference..." 添加 点击 ‘Add Library Package Reference...’ , 搜索你要添 ...
hdu 4857 逃生
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能 ...
检测android机器是否有GPS模块
public boolean hasGPSDevice(Context context) { final LocationManager mgr = (LocationManager)context. ...
使用ReactiveCocoa实现iOS平台响应式编程
使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Prog ...
nodejs的重要支柱
概念:模块(Module)和包(Package)是Node.js最重要的支柱. 开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分.分装.然后组合起来.模块正式为了实现这种方式而诞生 ...
jsp和servlet的区别和联系
jsp和servlet的区别和联系:1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能 ...
Properties集合_练习
定义功能:获取一个应用程序 运行次数,如果超过5次,给出使用次数已到请注册的提示,并不要再运行程序 思路: 1.定义计数器:每次程序启动都需要计数一次,并且是在原有的次数上进行计数. 2.计数器就 ...