| 
                         需求: 
在/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 
版权声明:本文为博主原创文章,转载请附上博文链接!                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |