用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地打开,防止打开一个超大文件爆内存。
withfile()可以打开一个文件之后不f.close()
#!/usr/bin/envpython
importtime
importos
importcPickleasp
importtarfile
importhashlib
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'
defmd5sum(fname):
m=hashlib.md5()
withfile(fname)asf:
whileTrue:
data=f.read(4096)
iflen(data)==0:
break
m.update(data)
returnm.hexdigest()
deffullBackup():
md5Dict={}
fileList=os.listdir(os.path.join(baseDir,srcDir))
foreachFileinfileList:
md5Dict[eachFile]=md5sum(os.path.join(baseDir,srcDir,eachFile))
withfile(os.path.join(baseDir,dstDir,md5file),'w')asf:
p.dump(md5Dict,f)
tar=tarfile.open(os.path.join(baseDir,dstDir,fullName),'w:gz')
os.chdir(baseDir)
tar.add(srcDir)
tar.close()
defincrBackup():
newmd5={}
fileList=os.listdir(os.path.join(baseDir,srcDir))
foreachFileinfileList:
newmd5[eachFile]=md5sum(os.path.join(baseDir,srcDir,eachFile))
withfile(os.path.join(baseDir,dstDir,md5file))asf:
storedmd5=p.load(f)
tar=tarfile.open(os.path.join(baseDir,dstDir,incrName),'w:gz')
os.chdir(baseDir)
foreachKeyinnewmd5:
if(eachKeynotinstoredmd5)or(newmd5[eachKey]!=storedmd5[eachKey]):
tar.add(os.path.join(srcDir,eachKey))
tar.close()
withfile(os.path.join(baseDir,dstDir,md5file),'w')asf:
p.dump(newmd5,f)
defmain():
iftime.strftime('%a')=='Mon':
fullBackup()
else:
incrBackup()
if__name__=='__main__':
main()
~
以上这篇用Python写脚本,实现完全备份和增量备份的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。