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

8
这是情景。我想使用Python脚本备份文件夹的内容。然而,我希望我的备份以zipped格式存储,可能是bz2格式。
问题在于,如果“current”文件夹中的内容与我最近备份中的内容完全相同,那么我就不想麻烦备份这个文件夹。
我的流程如下:
1. 启动备份 2. 检查“current”文件夹的内容是否与最近的压缩备份中的内容一致 3. 如果一样,则“完成” 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)可能没有这样易于访问的元数据。


这是一个好主意。你需要重新读取所有文件,但它会节省写入操作。 - invert

2
我使用这个脚本来创建压缩备份目录,只有在上次备份后目录内容发生变化时才会进行备份。
我使用外部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'

这个怎么被点赞了,它有语法错误。 - user1767754
这是来自2012年的内容,当时使用的是Python 2.7。 - gieffe
我不记得 <> 是个比较运算符,是我漏看了什么吗? - user1767754
https://docs.python.org/2/reference/expressions.html#comparisons - gieffe

1

你也可以尝试以下步骤:

1)初始化备份

2)运行备份

3)比较两个压缩文件:

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

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

5) 否则,“完成”

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

与解压文件夹并比较单个文件相比,我认为比较压缩文件可能更容易。总体而言,我觉得(好吧,这只是直觉:D)如果文件夹的内容在运行脚本时更改的概率很高,那么这将更好。


1

Rsync会自动检测并仅复制修改过的文件,但是考虑到您想要对结果进行bzip压缩,您仍然需要检测是否有任何更改。

您可以将目录列表(包括时间戳)输出到文本文件中,并将其与存档一起存储。下次使用diff命令将当前目录结构与此存储的文本进行比较。您可以使用grep命令从中提取差异,并将此文件列表传输到rsync以include这些已更改的文件。


有没有一种方法可以在不必从归档中提取内容的情况下检查文件的时间戳?这样我就可以避免提取该文件。 - Jimmy
检查您的bzip“列出存档内容”操作是否显示修改时间。如果没有显示,考虑将上次归档的时间存储在一个文件中,并与之进行比较。 - invert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接