如何比较两个tarball的内容

我想告诉两个tarball文件是否包含文件名和文件内容相同的文件,不包括date,用户,组等元数据。

但是有一些限制:第一,我无法控制制作tar文件时是否包含元数据,实际上tar文件中总是包含元数据,所以直接比较两个tar文件是行不通的。 其次,由于一些tar文件太大,我不能把它们解压到一个临时目录中,并逐个比较所包含的文件。 (我知道如果我可以将file1.tar解压到file1 /中,我可以通过在文件/中调用'tar -dvf file2.tar'来比较它们,但是我通常无法承受其中的一个)

任何想法如何我可以比较两个tar文件? 如果能在SHELL脚本中完成,会更好。 另外,有没有办法获得每个子文件的校验和,而实际上没有解压缩一个tarball?

谢谢,

Solutions Collecting From Web of "如何比较两个tarball的内容"

tarsum几乎是你所需要的。 把它的输出,通过排序来得到相同的排序,然后比较两个差异。 这应该会让你有一个基本的实现,通过修改Python代码来完成整个工作,将这些步骤放到主程序中是很容易的。

你是否在控制这些tar文件的创建?
如果是这样, 最好的办法是创建一个MD5校验和,并将其存储在档案本身的文件中。 然后,当你想比较两个文件,你只需要提取这个校验和文件并进行比较。


如果你只能提取一个tar文件你可以使用tar--diff选项来查找其他tar文件的内容。


如果你只是比较文件名和它们的大小,那么还有一个粗略的诀窍
请记住,这并不能保证其他文件是相同的!

执行tar tvf来列出每个文件的内容,并将输出存储在两个不同的文件中。 然后,除了文件名和大小列之外,还要除去所有内容。 最好也分类这两个文件。 然后,在两个列表之间做一个文件差异。

只要记住,这最后一个方案并不真正做校验。

示例tar和输出(在这个例子中所有文件都是零大小)。

 $ tar tvfj pack1.tar.bz2 drwxr-xr-x user/group 0 2009-06-23 10:29:51 dir1/ -rw-r--r-- user/group 0 2009-06-23 10:29:50 dir1/file1 -rw-r--r-- user/group 0 2009-06-23 10:29:51 dir1/file2 drwxr-xr-x user/group 0 2009-06-23 10:29:59 dir2/ -rw-r--r-- user/group 0 2009-06-23 10:29:57 dir2/file1 -rw-r--r-- user/group 0 2009-06-23 10:29:59 dir2/file3 drwxr-xr-x user/group 0 2009-06-23 10:29:45 dir3/ 

命令生成排序的名称/大小列表

 $ tar tvfj pack1.tar.bz2 | awk '{printf "%10s %s\n",$3,$6}' | sort -k 2 0 dir1/ 0 dir1/file1 0 dir1/file2 0 dir2/ 0 dir2/file1 0 dir2/file3 0 dir3/ 

你可以采取两个这样的排序列表,并区分它们。
如果适用于您,也可以使用日期和时间列。

我意识到这是一个迟到的回复,但我试图达到同样的目的,却碰到了这个问题。 我已经实现的解决方案将tar输出到stdout,并将其管理为您选择的散列值:

 tar -xOzf archive.tar.gz | sort | sha1sum 

请注意,论点的顺序是重要的; 尤其是那些使用stdout的信号。

这是我的变体,它也检查了Unix的权限:

仅在文件名短于200个字符的情况下有效。

 diff <(tar -tvf 1.tar | awk '{printf "%10s %200s %10s\n",$3,$6,$1}'|sort -k2) <(tar -tvf 2.tar|awk '{printf "%10s %200s %10s\n",$3,$6,$1}'|sort -k2) 

试用pkgdiff来显示软件包之间的差异(检测添加/删除/重命名的文件和更改的内容,如果没有更改,则使用零代码存在):

 pkgdiff PKG-0.tgz PKG-1.tgz 

在这里输入图像说明

在这里输入图像说明

tardiff你在找什么? 这是一个“简单的perl脚本”,用于比较两个tarball的内容,并对它们之间发现的任何差异进行报告。

如果没有提取档案,也不需要差异,请尝试diff的-q选项:

diff -q 1.tar 2.tar

这个安静的结果将是“1.tar 2.tar不同”或者什么也没有,如果没有区别的话。

有一个叫做archdiff的工具。 它基本上是一个perl脚本,可以查看档案。

 Takes two archives, or an archive and a directory and shows a summary of the differences between them. 

我有一个类似的问题,我通过python解决它,这里是代码。 ps:虽然这段代码是用来比较两个zipball的内容,但是和tarball类似,希望我能帮到你

 import zipfile import os,md5 import hashlib import shutil def decompressZip(zipName, dirName): try: zipFile = zipfile.ZipFile(zipName, "r") fileNames = zipFile.namelist() for file in fileNames: zipFile.extract(file, dirName) zipFile.close() return fileNames except Exception,e: raise Exception,e def md5sum(filename): f = open(filename,"rb") md5obj = hashlib.md5() md5obj.update(f.read()) hash = md5obj.hexdigest() f.close() return str(hash).upper() if __name__ == "__main__": oldFileList = decompressZip("./old.zip", "./oldDir") newFileList = decompressZip("./new.zip", "./newDir") oldDict = dict() newDict = dict() for oldFile in oldFileList: tmpOldFile = "./oldDir/" + oldFile if not os.path.isdir(tmpOldFile): oldFileMD5 = md5sum(tmpOldFile) oldDict[oldFile] = oldFileMD5 for newFile in newFileList: tmpNewFile = "./newDir/" + newFile if not os.path.isdir(tmpNewFile): newFileMD5 = md5sum(tmpNewFile) newDict[newFile] = newFileMD5 additionList = list() modifyList = list() for key in newDict: if not oldDict.has_key(key): additionList.append(key) else: newMD5 = newDict[key] oldMD5 = oldDict[key] if not newMD5 == oldMD5: modifyList.append(key) print "new file lis:%s" % additionList print "modified file list:%s" % modifyList shutil.rmtree("./oldDir") shutil.rmtree("./newDir") 

可以使用一个简单的脚本:

 #!/usr/bin/env bash set -eu tar1=$1 tar2=$2 shift 2 tar_opts=("$@") tmp1=`mktemp -d` _trap="rm -r "$tmp1"; ${_trap:-}" && trap "$_trap" EXIT tar xf "$tar1" -C "$tmp1" tmp2=`mktemp -d` _trap="rm -r "$tmp2"; ${_trap:-}" && trap "$_trap" EXIT tar xf "$tar2" -C "$tmp2" diff -ur "${tar_opts[@]:+${tar_opts[@]}}" "$tmp1" "$tmp2" 

用法:

 diff-tars.sh TAR1 TAR2 [DIFF_OPTS]