Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么在`gzip`之前通过`tar cf`运行我的文件会改变它们的内容?_Linux_Unix_Compression_Gzip_Tar - Fatal编程技术网

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包。。。