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

来源:互联网 发布:淘宝联盟手机版分享赚 编辑:程序博客网 时间:2024/05/17 06:32

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

思路及关键点:

  1. 建立一个文件,以字典方式记录src的文件名以及文件对应的md5的值
  2. 完全备份的时候将文件名和md5值写在一个文件里面。cPickle的知识点。
  3. 增量备份的时候比较文件名是否在key里面,没有就要备份;有的话,这个文件的md5值是否改变,改变了就要备份
  4. os.path.join()拼接路径,os.listdir(),os.chdir()
  5. time.strftime()判断周几
  6. cPickle,可以无损记录所有Python的变量类型。文件操作。
  7. tarfile对文件打包的使用
  8. hashlib用于计算文件md5的值。注意不要一次打开一个文件,4k地打开,防止打开一个超大文件爆内存。
  9. with file()可以打开一个文件之后不f.close()
#!/usr/bin/env pythonimport timeimport osimport cPickle as pimport tarfileimport hashlibbaseDir = '/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,dstDir,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,srcDir,eachFile))    with file(os.path.join(baseDir,dstDir,md5file)) as f:        storedmd5 = p.load(f)    tar = tarfile.open(os.path.join(baseDir,dstDir,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,dstDir,md5file),'w') as f:        p.dump(newmd5,f)def main():    if time.strftime('%a') == 'Mon':        fullBackup()    else:        incrBackup()if __name__ == '__main__':    main()~                 
0 0