为什么在`gzip`之前通过`tar cf`运行我的文件会改变它们的内容?

时间:2016-04-07 01:11:19

标签: linux unix compression gzip tar

让我们首先创建两个内容相同的文件:

echo "content" > file1
echo "content" > file2

现在,如果我们使用gzip压缩每个文件,那么这些文件是完全相同的,不出所料:

gzip --no-name file1
gzip --no-name file2
diff -u file1.gz file2.gz

(不出所料,diff命令不返回任何输出。)

但是,假设我们使用文件执行此操作:

tar cf - file1 | gzip --no-name > file1.tar.gz
tar cf - file2 | gzip --no-name > file2.tar.gz

当我们运行diff时会发生什么?

% diff -u file1.tar.gz file2.tar.gz
Binary files file1.tar.gz and file2.tar.gz differ

这对我来说很惊讶。我需要将哪些选项传递给tar,以便两个tar ... | gzip ...命令的输出相同?

供参考,当我跑

tar cf - file | gzip --no-name > file1.tar.gz
tar cf - file | gzip --no-name > file2.tar.gz

输出相同。所以 tar的输出正在根据我运行它的时间而改变,所以必须是tar将其输入的最后修改时间合并到焦油输出。这不是我想要的行为。

2 个答案:

答案 0 :(得分:4)

TAR file format包含文件名和其他目录信息,因此文件会有所不同,除非它们包含具有相同名称,大小等的相同文件。

答案 1 :(得分:0)

要查看正在发生的事情,请查看此内容

echo "tea" > file1
echo "tea" > file2

现在运行以下两个命令。

tar cf - file1
tar cf - file1 | gzip -c --no-name | gunzip -c

您会注意到在这两种情况下输出都是相同的,即gzip的选项--no-name没有任何影响(它确实删除了它自己的时间戳,但它没有&t; t从tar输出中删除文件名)。这是因为文件名是tar格式的一部分,而gzip不解析它从tar获取的内容。这就是为什么当你拥有相同的文件名时,你会获得相同的相同输出。