如何比较两个tarball的内容
-
06-07-2019 - |
题
我想告诉两个tarball文件在文件名和文件内容方面是否包含相同的文件,不包括日期,用户,组等元数据。
但是,有一些限制: 首先,我无法控制在制作tar文件时是否包含元数据,实际上,tar文件总是包含元数据,因此直接对两个tar文件进行区分不起作用。 其次,由于一些tar文件太大,以至于我无法将它们解压缩到临时目录中并逐个区分包含的文件。 (我知道如果我可以将file1.tar解压缩到file1 /中,我可以通过在文件/中调用'tar -dvf file2.tar'来比较它们。但通常我甚至不能解决其中一个问题)
知道如何比较两个tar文件吗?如果可以在SHELL脚本中完成它会更好。或者,有没有办法获得每个子文件的校验和而不实际解压缩tarball?
谢谢,
解决方案
tarsum 几乎就是你所需要的。获取其输出,通过排序运行以获得每个排序相同,然后将两者与diff进行比较。这应该会让你获得一个基本的实现,并且通过修改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/
你可以采取两个这样的排序列表并区分它们 如果适合您,您还可以使用日期和时间列。
这是我的变体,它也在检查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)
我意识到这是一个迟到的回复,但我在尝试实现同样的事情时遇到了这个问题。我实现的解决方案将tar输出到stdout,并将其传递给您选择的任何哈希:
tar -xOzf archive.tar.gz | sort | sha1sum
请注意,参数的顺序很重要;特别是 O
,表示使用stdout。
tardiff 您要找的是什么?它是“一个简单的perl脚本”。 “比较两个tarball的内容并报告它们之间发现的任何差异。”
有一个名为 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")
还有 diffoscope ,它更通用,并且允许递归地比较事物(包括各种格式)。
pip install diffoscope
可以使用简单的脚本:
#!/usr/bin/env bash
set -eu
tar1=$1
tar2=$2
shift 2
tar_opts=("$@")
tmp1=`mktemp -d`
_trap="rm -r "$tmp1"; ${_trap:-}" && trap "可以使用简单的脚本:
diff-tars.sh TAR1 TAR2 [DIFF_OPTS]
用法:
<*>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"
用法:
<*>