您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

【Python】用Python写脚本,完全备份和增量备份

5b51 2022/1/14 8:25:19 python 字数 6675 阅读 964 来源 www.jb51.cc/python

需求:? 在/root/backup下面有两个文件夹dst和src。要求在周一的时候进行完全备份,其余日子进行增量备份。从src备份到dst。

概述

需求: 
在/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()

<pre class="has">
#!/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,eachFile))
    with file(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()

~   


--------------------- 
作者:huangyingleo 
来源:CSDN 
原文:https://blog.csdn.net/huangyingleo/article/details/55002230 
版权声明:本文为博主原创文章,转载请附上博文链接

总结

以上是编程之家为你收集整理的【Python】用Python写脚本,完全备份和增量备份全部内容,希望文章能够帮你解决【Python】用Python写脚本,完全备份和增量备份所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶