Linux 为什么在`gzip`之前通过`tar cf`运行我的文件会改变它们的内容?
让我们首先创建两个内容相同的文件:Linux 为什么在`gzip`之前通过`tar cf`运行我的文件会改变它们的内容?,linux,unix,compression,gzip,tar,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 &
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
将其输入的最后修改时间合并到tarred输出中的情况。这不是我想要的行为。包含文件名和其他目录信息,因此文件将有所不同,除非它们包含具有相同名称、大小等的相同文件。要查看发生了什么,请查看此信息
echo "tea" > file1
echo "tea" > file2
现在运行以下两个命令
tar cf - file1
tar cf - file1 | gzip -c --no-name | gunzip -c
您会注意到,在这两种情况下,输出都是相同的,即gzip的选项
--no name
没有任何效果(它确实删除了自己的时间戳,但没有从tar输出中删除文件名)。这是因为文件名是tar格式的一部分,而gzip不解析它从tar获得的内容。这就是为什么当您有相同的文件名时,您会得到相同的输出。@ElizabethLin。。。还有不同的名字。TAR存档包含打包在存档中的文件目录。该目录包含文件名、大小、所有者、perms和其他文件系统详细信息。请在投票否决我之前阅读链接文件。为什么投票否决?似乎回答了这个问题。Tar两个不同名称的文件,接收不同的Tar包。。。