import time
import os
import hashlib
import tarfile
import pickle
def check_md5(fname):
'计算每个文件MD5值'
m = hashlib.md5()
with open(fname,'rb') as fobj:
while 1:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
def full_back(src,dst,md5):
'数据完全备份'
'备份文件名'
fn = '%s_funll_%s.gz' \
%(os.path.basename(src),time.strftime("%Y%m%d"))
fname = os.path.join(dst,fn)
'tar实行备份'
tar = tarfile.open(fname,'w:gz')
tar.add(src)
tar.close()
'获取文件md5值,保存在MD5文件'
md5dict = {}
for paths,folders,files in os.walk(src):
for file in files:
key = os.path.join(paths,file)
md5dict[key] = check_md5(key)
with open(md5,'wb') as fobj:
pickle.dump(md5dict,fobj)
def inc_back(src,dst,md5):
#'数据增量备份'
#'备份文件名'
fn = '%s_inc_%s.gz' \
% (os.path.basename(src), time.strftime("%Y%m%d"))
fname = os.path.join(dst, fn)
#'读取前一天MD5值'
with open(md5, 'rb')as fobj:
old_dict = pickle.load(fobj)
#'获取当前文件MD5值'
md5dict = {}
for paths, folders, files in os.walk(src):
for file in files:
key = os.path.join(paths, file)
md5dict[key] = check_md5(key)
#'找出更改及新曾文件实行备份'
tar = tarfile.open(fname,'w:gz')
for key in md5dict:
#if fname not in old_dict or md5dict[fname] != old_md5[fname]
if old_dict.get(key) != md5dict[key]:
tar.add(key)
tar.close()
#'更新md5值'
with open(md5, 'wb') as fobj:
pickle.dump(md5dict, fobj)
if __name__ == '__main__':
src = '/mylibs/security'
dst = '/mylibs/backup'
md5 = '/mylibs/md5.data'
if (time.strftime('%a') == 'Mon') or not (os.path.exists(md5)):
full_back(src,dst,md5)
inc_back(src,dst,md5)
项目需求:利用python3脚本实现每周一对数据文件完全备份,其他时间只增量备份
最新推荐文章于 2023-06-05 04:51:22 发布