pyrhon-文件备份程序(90)

import time
import os
import tarfile
import hashlib
import pickle

def check_md5(fname):
    m = hashlib.md5()   #创建md5对象
    with open(fname,'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  #更新md5对象
    return m.hexdigest()    #返回md5对象

def full_backup(src_dir,dst_dir,md5file):   #完全备份
    fname = os.path.basename(src_dir.rstrip('/'))   #去除目录最后的根号(rstrip()),取最后的一个单个文件(basename())
    fname = '%s_full_%s.tar.gz' % (fname,time.strftime('%Y%m%d'))   #备份后包的名字:文件名_full_日期.tar.gz
    fname = os.path.join(dst_dir,fname) #合并路径,形成绝对路径
    md5dict = {}    #定义一个字典,用于放文件名和对应的md5值

    tar = tarfile.open(fname,'w:gz')    ###对文件进行打包
    tar.add(src_dir)    #添加要打包的目录
    tar.close()

    for path,folders,files in os.walk(src_dir): #walk(),遍历目录树,自顶向下或自底向上生成目录树下的文件名
        for each_file in files:
            key = os.path.join(path,each_file)  #合并路径
            md5dict[key] = check_md5(key)   #添加到字典

        with open(md5file,'wb') as fobj:
            pickle.dump(md5dict,fobj)   #将字典的内容添加到文件中

def incr_backup(src_dir,dst_dir,md5file):   #增量备份
    fname = os.path.basename(src_dir.rstrip('/'))
    fname = '%s_incr_%s.tar.gz' % (fname,time.strftime('%Y%m%d'))
    fname = os.path.join(dst_dir,fname)
    md5dict = {}

    with open(md5file,'rb') as fobj:
        oldmd5 = pickle.load(fobj)      #将旧的md5值从文件内取出来

    for path,folders,files in os.walk(src_dir):
        for each_file in files:
            key = os.path.join(path,each_file)
            md5dict[key] = check_md5(key)   #向字典内添加新的md5值

    with open(md5file,'wb') as fobj:
        pickle.dump(md5dict,fobj)   #将新的那个md5字典内容写入文件内

    tar = tarfile.open(fname,'w:gz')
    for key in md5dict:     #循环遍历,将旧的字典内容与新的字典内容进行比对,然后将有改变的文件进行打包
        if oldmd5.get(key) != md5dict[key]:
            tar.add(key)
    tar.close()

if __name__ == '__main__':
    #mkdir /tmp/backup;cp -r /etc/security /tmp/
    src_dir = '/tmp/security'
    dst_dir = '/tmp/backup'
    md5file = '/tmp/backup/md5.data'
    if time.strftime('%a') == 'Mon':    #星期一,完全备份,否则增量备份
        full_backup(src_dir,dst_dir,md5file)
    else:
        incr_backup(src_dir,dst_dir,md5file)









你可能感兴趣的:(python)