用Python写脚本,实现完全备份和增量备份的示例
|
需求: 在/root/backup下面有两个文件夹dst和src。要求在周一的时候进行完全备份,其余日子进行增量备份。从src备份到dst。 思路及关键点: 建立一个文件,以字典方式记录src的文件名以及文件对应的md5的值 完全备份的时候将文件名和md5值写在一个文件里面。cPickle的知识点。 增量备份的时候比较文件名是否在key里面,没有就要备份;有的话,这个文件的md5值是否改变,改变了就要备份 os.path.join()拼接路径,os.listdir(),os.chdir() time.strftime()判断周几 cPickle,可以无损记录所有Python的变量类型。文件操作。 tarfile对文件打包的使用 hashlib用于计算文件md5的值。注意不要一次打开一个文件,4k地打开,防止打开一个超大文件爆内存。 with file()可以打开一个文件之后不f.close()
#!/usr/bin/env python
import time
import os
import cPickle as p
import tarfile
import hashlib
baseDir = '/root/backup'
srcDir = 'src'
dstDir = 'dst'
fullName = "full_%s_%s.tar.gz" % (srcDir,time.strftime('%Y%m%d'))
incrName = "incr_%s_%s.tar.gz" % (srcDir,time.strftime('%Y%m%d'))
md5file = 'md5.data'
def md5sum(fname):
m = hashlib.md5()
with file(fname) as f:
while True:
data = f.read(4096)
if len(data) == 0:
break
m.update(data)
return m.hexdigest()
def fullBackup():
md5Dict = {}
fileList = os.listdir(os.path.join(baseDir,srcDir))
for eachFile in fileList:
md5Dict[eachFile] = md5sum(os.path.join(baseDir,srcDir,eachFile))
with file(os.path.join(baseDir,dstDir,md5file),'w') as f:
p.dump(md5Dict,f)
tar = tarfile.open(os.path.join(baseDir,fullName),'w:gz')
os.chdir(baseDir)
tar.add(srcDir)
tar.close()
def incrBackup():
newmd5 = {}
fileList = os.listdir(os.path.join(baseDir,srcDir))
for eachFile in fileList:
newmd5[eachFile] = md5sum(os.path.join(baseDir,md5file)) as f:
storedmd5 = p.load(f)
tar = tarfile.open(os.path.join(baseDir,incrName),'w:gz')
os.chdir(baseDir)
for eachKey in newmd5:
if (eachKey not in storedmd5) or (newmd5[eachKey] != storedmd5[eachKey]):
tar.add(os.path.join(srcDir,eachKey))
tar.close()
with file(os.path.join(baseDir,'w') as f:
p.dump(newmd5,f)
def main():
if time.strftime('%a') == 'Mon':
fullBackup()
else:
incrBackup()
if __name__ == '__main__':
main()
~
以上这篇用Python写脚本,实现完全备份和增量备份的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
