我正在制定共享协议,当您共享文件夹时,它会被 tar.gz 压缩并插入到文件夹中。
它是这样创建的:
with tarfile.open(full_data_name, "w:gz", format=GNU_FORMAT) as tar_handle:
...
tar_handle.add(file_path)
当您再次执行此操作时,我想验证并检查新的 tar.gz 是否与旧的相同(因此我不需要重新发布它)。
我知道 pkgdiff 并且工作正常,但我想用 python 来做。
我也知道我可以手动完成,解压和压缩文件,加载内容并逐字节验证,但是没有一些更简单且资源消耗更少的方法吗?
我尝试只检查 tar.gz 文件的内容(删除字节 4-7 处的时间戳),但这仅有时有效,所以我猜 tar 部分中存在一些随机重新排列,或者 gz 中存在一些随机性,正如 pkgdiff 所说,它们是相同的,但十六进制编辑器显示出很多差异。
您可以提取内存中的文件并计算校验和。这可以避免物理提取整个存档。
import tarfile
import hashlib
def get_tar_checksum(tar_path):
with tarfile.open(tar_path, "r:gz") as tar:
checksums = {}
for member in tar.getmembers():
if member.isfile():
file_data = tar.extractfile(member).read()
checksums[member.name] = hashlib.sha256(file_data).hexdigest()
return checksums
def tar_equal(tar_path1, tar_path2):
return get_tar_checksum(tar_path1) == get_tar_checksum(tar_path2)
# Usage
tar1 = "path/to/first.tar.gz"
tar2 = "path/to/second.tar.gz"
if tar_equal(tar1, tar2):
print("The tar.gz files are identical.")
else:
print("The tar.gz files are different.")
如果比较的 tar 相同,则
tar_equal(tar_path1, tar_path2)
方法将返回 True
。您可以从那里实现您的逻辑。