文件备份程序工具

 1 import os
 2 import tarfile
 3 import pickle
 4 import hashlib
 5 from time import strftime
 6 
 7 def check_md5(fname):
 8     m = hashlib.md5()
 9     with open(fname, 'rb') as fobj:
10         while True:
11             data = fobj.read(4096)
12             if not data:
13                 break
14             m.update(data)
15     return m.hexdigest()
16 
17 def full_backup(src_dir, dst_dir, md5file):
18   # 构建备份文件的绝对路径
19     fname = '%s_full_%s.tar.gz' %\
20             (os.path.basename(src_dir.rstrip('/')), strftime('%Y%m%d'))
21     fname = os.path.join(dst_dir, fname)
22 
23     # 将源目录打包压缩
24     tar = tarfile.open(fname, 'w:gz')
25     tar.add(src_dir)
26     tar.close()
27 
28     # 计算每个文件的md5值
29     md5dict = {}
30     for path, folders, files in os.walk(src_dir):
31         for file in files:
32             key = os.path.join(path, file)
33             md5dict[key] = check_md5(key)
34 
35     # 将md5字典写入文件
36     with open(md5file, 'wb') as fobj:
37         pickle.dump(md5dict, fobj)
38 
39 def incr_backup(src_dir, dst_dir, md5file):
40     # 构建备份文件的绝对路径
41     fname = '%s_incr_%s.tar.gz' % \
42             (os.path.basename(src_dir.rstrip('/')), strftime('%Y%m%d'))
43     fname = os.path.join(dst_dir, fname)
44 
45     # 计算每个文件的md5值
46     md5dict = {}
47     for path, folders, files in os.walk(src_dir):
48         for file in files:
49             key = os.path.join(path, file)
50             md5dict[key] = check_md5(key)
51 
52     # 取出前一天的md5值
53     with open(md5file, 'rb') as fobj:
54         old_md5 = pickle.load(fobj)
55 
56     # 更新md5文件
57     with open(md5file, 'wb') as fobj:
58         pickle.dump(md5dict, fobj)
59 
60     # 将变化的文件和新增的文件备份
61     tar = tarfile.open(fname, 'w:gz')
62     for key in md5dict:
63         if old_md5.get(key) != md5dict[key]:
64             tar.add(key)
65     tar.close()
66 
67 if __name__ == '__main__':
68     src_dir = '/tmp/mydemo/security/'
69     dst_dir = '/tmp/demo/'
70     md5file = '/tmp/demo/md5.data'
71     if strftime('%a') == 'Mon':
72         full_backup(src_dir, dst_dir, md5file)
73     else:
74         incr_backup(src_dir, dst_dir, md5file)

 

转载于:https://www.cnblogs.com/lck320123/p/10638827.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值