这就是场景。我希望能够使用python脚本备份文件夹的内容。但是,我希望我的备份以压缩格式存储,可能是bz2。
问题来自于,如果“current”文件夹中的内容与我最近的备份中的内容完全相同,我不想打扰备份文件夹。
我的流程将是这样的:
任何人都可以推荐最可靠,最简单的方法来完成第二步吗?我是否必须将备份的内容解压缩并存储在临时目录中以进行比较,或者是否有更优雅的方法来执行此操作?可能与修改日期有关吗?
答案 0 :(得分:4)
Zip文件包含CRC32校验和,您可以使用python zipfile模块读取它们:http://docs.python.org/2/library/zipfile.html。您可以从ZipFile.infolist()获取具有CRC成员的ZipInfo对象列表。 ZipInfo对象中还有修改日期。
您可以将zip校验和与已解压缩文件的计算校验和进行比较。您需要阅读解压缩的文件,但不必解压缩所有内容。
CRC32不是加密校验和,但如果您只需检查更改,它就足够了。
这适用于zip文件。其他存档格式(如tar.bz2)可能不包含易于访问的元数据。
答案 1 :(得分:1)
Rsync将自动检测并仅复制已修改的文件,但看到您想要对结果进行bzip,您仍需要检测是否有任何更改。
如何将目录列表(包括时间戳)输出到存档旁边的文本文件中。下次diff
针对此存储文本的当前目录结构。您可以将差异输出并将此文件列表通过管道传输到include
这些已更改的文件。
答案 2 :(得分:1)
您还可以尝试以下过程:
1)启动备份
2)运行备份
3)比较两个压缩文件:
import filecmp
filecmp.cmp(Compressed_new_file, Compressed_old_file, shallow=True)
4)如果相同 - 删除新的备份文件,然后“完成”
5)否则“完成”
注意:如果您需要检查修改之间的时间,可以查看this documentation
我认为比较压缩文件可能更容易,而不是解压缩文件夹并比较单个文件。 总的来说,我觉得(好吧,这只是一种直觉:D)如果文件夹的内容很可能在您运行脚本的时间之间发生变化,这将会更好
答案 3 :(得分:1)
我使用此脚本来创建目录的压缩备份 仅在上次备份后目录内容发生变化时才会显示。
我使用外部md5文件存储备份文件的摘要,然后检查 它可以检测目录更改。
import hashlib
import tarfile
import bz2
import cStringIO
import os
def backup_dir(dirname, backup_path):
fobj = cStringIO.StringIO()
t = tarfile.open(mode='w',fileobj=fobj)
t.add(dirname)
t.close()
buf = fobj.getvalue()
new_md5 = hashlib.md5(buf).digest()
if os.path.isfile(backup_path + '.md5'):
old_md5 = open(backup_path + '.md5').read()
else:
old_md5 = ''
if new_md5 <> old_md5:
open(backup_path, 'wb').write(bz2.compress(buf))
open(backup_path + '.md5', 'wb').write(new_md5)
print 'backup done!'
else:
print 'nothing to do'