如何优雅地比较zip文件夹内容和解压缩的文件夹内容

时间:2012-11-19 09:48:49

标签: python zip backup unzip

这就是场景。我希望能够使用python脚本备份文件夹的内容。但是,我希望我的备份以压缩格式存储,可能是bz2。

问题来自于,如果“current”文件夹中的内容与我最近的备份中的内容完全相同,我不想打扰备份文件夹。

我的流程将是这样的:

  1. 启动备份
  2. 根据最新的压缩备份中存储的内容检查“当前”文件夹的内容
  3. 如果相同 - 那么“完成”
  4. 如果不同,则运行备份,然后“完成”
  5. 任何人都可以推荐最可靠,最简单的方法来完成第二步吗?我是否必须将备份的内容解压缩并存储在临时目录中以进行比较,或者是否有更优雅的方法来执行此操作?可能与修改日期有关吗?

4 个答案:

答案 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'