【问题标题】:Why does running my files through `tar cf` before `gzip` change their content?为什么在`gzip`之前通过`tar cf`运行我的文件会改变它们的内容?
【发布时间】:2016-04-07 01:11:19
【问题描述】:

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

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 输出中。这不是我想要的行为。

【问题讨论】:

    标签: linux unix compression gzip tar


    【解决方案1】:

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

    【讨论】:

    • @ElizabethLin ... 和不同的名字。 TAR 存档包含捆绑在存档中的文件的目录。该目录包含文件名、大小、所有者、权限和其他文件系统详细信息。请在对我投反对票之前阅读链接的文档。
    • 为什么投反对票?似乎回答了这个问题。 tar 两个不同名字的文件,接收不同的tar bundle...
    【解决方案2】:

    要了解发生了什么,请查看此

    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 获得的内容。这就是为什么当你有相同的文件名时你会得到相同的输出。

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 2010-10-04
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2010-11-09
      • 2019-11-11
      • 1970-01-01
      相关资源
      最近更新 更多