相同的tar归档文件返回它们并不完全相同

时间:2015-04-11 21:54:51

标签: bash diff tar

我有一个使用命令

生成tar存档的脚本
tar -zacf /tmp/foo.tar.gz /home/yotam/foo

然后检查tar文件是否在某个文件夹中,并检查两个档案之间是否有任何变化,如果是,则保留新档案

if ! [ -e /home/yotam/barr/foo.tar.gz ]; then
    cp /tmp/foo.tar.gz /home/yotam/bar/foo.tar.gz
    cond=1
else 
    #compare
    diff --brief <(sort /tmp/foo.tar.gz) <(sort /home/yotam/bar/foo.tar.gz) >/dev/null
    cond=$?

fi

if [ $cond -eq 1 ]; then
    rm /home/yotam/bar/foo.tar.gz
    cp /tmp/foo.tar.gz /home/yotam/foo.tar.gz
fi

但是,此脚本始终将两个存档文件视为不同,即使我没有在两个存档中的任何一个或foo文件夹本身中执行任何操作。我的支票出了什么问题?

编辑:

为了它的价值,用

替换diff文件
diff --brief  /tmp/foo.tar.gz /home/yotam/bar/foo.tar.gz >/dev/null

产生相同的结果。

2 个答案:

答案 0 :(得分:0)

我不确定gzip存档是否可以用作哈希函数。也许gzip打包实现依赖于当前的日期时间,然后为每次执行产生不同的输出。

我建议使用一些广泛使用的哈希函数。例如,看一下git内部哈希实现 - shasum

更多信息:How does git compute file hashes?

答案 1 :(得分:0)

在对行进行排序后,您似乎正在对压缩的tar档案进行逐行比较。有多种原因可以解释为什么这是一个坏主意(对于一个原因:对于gzip压缩的东西进行排序没有意义)。要检查2个文件是使用diff file1 file2还是计算每个文件的哈希值(使用md5 / md5sum filename)并进行比较。

问题是gzip在zip存档中添加了gzip文件的名称。如果您有2个相同的文件然后gzip这些,您将获得2个不同的档案。

那么你能做些什么来解决这个问题呢?例如,您可以比较两个文件的gunziped版本:diff <(gzcat out/out2.tar.gz) <(gzcat out2.tar.gz)。我假设你有sort,以防文件以不同的顺序被涂焦,但我认为你不必担心。如果这对您来说是个问题,请查看tarsum之类的内容。这将为您提供更好的结果,因为如果使用sort,您将不会注意到将一行从一个文件移动到另一个文件,或者在文件中切换两行。