我有一个使用命令
生成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
产生相同的结果。
答案 0 :(得分:0)
我不确定gzip存档是否可以用作哈希函数。也许gzip打包实现依赖于当前的日期时间,然后为每次执行产生不同的输出。
我建议使用一些广泛使用的哈希函数。例如,看一下git内部哈希实现 - shasum
。
答案 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,您将不会注意到将一行从一个文件移动到另一个文件,或者在文件中切换两行。