我有两个*.tar
内容相似的文件。我想验证哪些文件是相同的。很多文件都很大,因此比较哈希值需要从每个 tar 中提取每个文件并计算哈希值。有没有办法在不提取 tar 的情况下对 tar 中的文件进行哈希处理?还有其他方法可以比较两个*.tar
文件之间的文件吗?
答案1
如果是 GNU tar,请运行以下命令:
tar -xf file1.tar --to-command=file-stats-from-tar
其中 file-stats-from-tar 位于某处$PATH
并且是:
#!/bin/bash
md5=`md5sum`;
md5=${md5%% *}
printf "%s\t%s\n" $md5 "$TAR_FILENAME"
md5sum
如果需要的话就改变。
只需一次即可完成所有操作。
它的工作原理是该--to-command
选项告诉 tar 发送每个文件单独添加到您指定的命令中,并设置一堆环境变量(我们只TAR_FILENAME
在这里使用)。
答案2
可能有更有效的方法,但我很快就想出了这个:
tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done
第一个tar tf
只是列出存档中的文件,然后将其传递到while read x
bash 循环中。对于每个文件名,它使用 找到哈希值。tar xfO test.tar ${x} | md5sum
显然,你可以用你喜欢的哈希工具替换 md5sum。 的奇怪用法echo $() ${x}
只是为了保持输出类似于常规哈希输出,左侧是值,右侧是文件名。如果没有它,它只会给你所有文件的哈希值,但没有名称,所以你无法分辨哪个文件去了哪个文件。即使有它,-
输出中也会有一个通常不存在的额外列。可以使用colrm
管道中的命令轻松将其删除。
这可能不是最有效的,因为如果 tar 文件中有 n 个文件,它就必须遍历 tar 文件 n+1 次,但希望在第一次读取后 tar 内容被缓存。