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)









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值