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)
pyrhon-文件备份程序(90)
最新推荐文章于 2021-08-14 13:15:16 发布