7

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

问题在于,如果“当前”文件夹中的内容与我最近备份的内容完全相同,我不想费心备份该文件夹。

我的过程将是这样的:

  1. 启动备份
  2. 根据最新压缩备份中存储的内容检查“当前”文件夹的内容
  3. 如果相同 - 则“完成”</li>
  4. 如果不同,则运行备份,然后“完成”</li>

任何人都可以推荐完成第 2 步的最可靠和最简单的方法吗?我是否必须解压缩备份的内容并将其存储在临时目录中才能进行比较,还是有更优雅的方法来做这件事?可能与修改日期有关?

4

4 回答 4

6

Zip 文件包含 CRC32 校验和,您可以使用 python zipfile 模块读取它们:http: //docs.python.org/2/library/zipfile.html。您可以从 ZipFile.infolist() 获取具有 CRC 成员的 ZipInfo 对象列表。ZipInfo 对象中也有修改日期。

您可以将 zip 校验和与解压缩文件的计算校验和进行比较。您需要阅读解压后的文件,但不必解压缩所有内容。

CRC32 不是加密校验和,但如果您只需要检查更改就足够了。

这适用于 zip 文件。其他存档格式(如 tar.bz2)可能不包含此类易于访问的元数据。

于 2012-11-19T12:26:08.447 回答
1

Rsync 会自动检测并只复制修改过的文件,但是当你想要 bzip 结果时,你仍然需要检测是否有任何变化。

您如何将目录列表(包括时间戳)输出到存档旁边的文本文件中。下次您diff针对此存储文本的当前目录结构。您可以 grep 差异并将此文件列表通过管道传输到 rsync 到include那些更改的文件。

于 2012-11-19T09:56:29.240 回答
1

您也可以尝试以下过程:

1) 启动备份

2) 运行备份

3)比较两个压缩文件:

import filecmp
filecmp.cmp(Compressed_new_file, Compressed_old_file, shallow=True)

4)如果相同 - 删除新的备份文件然后“完成”

5) 否则“完成”</p>

注意:如果您只需要检查修改之间的时间,您可以查看此文档

与其解压缩文件夹并比较单个文件,我认为比较压缩文件可能更容易。总的来说,我觉得(好吧,这只是一种直觉:D)如果文件夹的内容很可能在您运行脚本的时间之间发生变化,这会更好

于 2012-11-19T11:42:31.733 回答
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'
于 2012-11-19T15:25:45.263 回答