Stephen Rasku Asked: 2020-01-26 11:31:47 +0800 CST2020-01-26 11:31:47 +0800 CST 2020-01-26 11:31:47 +0800 CST tar 文件中的哈希文件 772 我有两个*.tar内容相似的文件。我想验证哪些文件是相同的。很多文件都很大,所以我比较哈希需要从每个 tar 中提取每个文件并计算哈希。有没有办法在 tar 中散列文件而不必提取它?还有另一种方法来比较两个*.tar文件之间的文件吗? tar 2 个回答 Voted Best Answer user512619 2020-01-26T22:53:57+08:002020-01-26T22:53:57+08:00 如果是 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在这里使用)。 JustinB 2020-01-26T16:12:28+08:002020-01-26T16:12:28+08:00 可能有更有效的方法,但我很快就想出了这个: tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done 第一个tar tf只是列出存档中的文件,然后将其传递到while read xbash 循环中。对于每个文件名,它会使用tar xfO test.tar ${x} | md5sum您显然可以将 md5sum 替换为您首选的哈希工具来查找哈希。的奇怪用途echo $() ${x}只是保持输出类似于常规哈希输出,左侧的值和右侧的文件名。没有它,它只会为您提供所有文件的哈希值,但没有名称,因此您无法分辨哪个文件去了哪个文件。即使有了它,-输出中也有一列通常不存在的额外列。它可以通过colrm管道中的命令轻松删除。 这可能不是最有效的,因为如果其中有 n 个文件,它必须遍历 tar 文件 n+1 次,但希望 tar 内容在第一次读取后被缓存。
如果是 GNU tar,请运行以下命令:
其中 file-stats-from-tar 在某处
$PATH
并且是:md5sum
如果需要,请更改。这一步就完成了。
它的工作原理是该
--to-command
选项告诉 tar 将每个文件分别发送到您指定的命令,并设置一堆环境变量(我们只TAR_FILENAME
在这里使用)。可能有更有效的方法,但我很快就想出了这个:
第一个
tar tf
只是列出存档中的文件,然后将其传递到while read x
bash 循环中。对于每个文件名,它会使用tar xfO test.tar ${x} | md5sum
您显然可以将 md5sum 替换为您首选的哈希工具来查找哈希。的奇怪用途echo $() ${x}
只是保持输出类似于常规哈希输出,左侧的值和右侧的文件名。没有它,它只会为您提供所有文件的哈希值,但没有名称,因此您无法分辨哪个文件去了哪个文件。即使有了它,-
输出中也有一列通常不存在的额外列。它可以通过colrm
管道中的命令轻松删除。这可能不是最有效的,因为如果其中有 n 个文件,它必须遍历 tar 文件 n+1 次,但希望 tar 内容在第一次读取后被缓存。