为什么我要压缩单个文件?

gar*_*ead 103 tar archive compression

在我的公司,我们将本地开发数据库快照下载为db.dump.tar.gz文件。压缩是有道理的,但 tarball 只包含一个文件 ( db.dump)。

归档单个文件是否有任何意义,或者.tar.gz只是这样一种常见的习惯用法?为什么不只是.gz

jof*_*fel 164

使用.tar.gz而不是的优点.gz

  • tar存储的元数据(UNIX 权限等)比gzip.
  • 可以更轻松地扩展设置以存储多个文件
  • .tar.gz 文件很常见,只有 gzipped文件可能会让一些用户感到困惑。(参见 MelBurslans 评论

使用的开销tar也很小。

如果不是真的需要,我仍然不建议 tar 单个文件。有可以直接访问压缩单个文件很多有用的工具(如zcatzgrep等-也为现有的bzip2xz)。

  • 我没有考虑元数据方面。很好的一点 (36认同)
  • 如果我看到`.gz`,我的第一反应就是`tar -zxf foo.gz`。记住 gzip 甚至是一个命令还需要几秒钟的时间。 (5认同)
  • @bgStack15 FWIW 你不需要`z`(或`-`),大多数现代`tar`s 会自动检测需要解压缩的文件。 (2认同)
  • 默认情况下,`gzip` 将存储原始文件名和时间戳。您可以在解压时使用 `-N` 选项来恢复它们。 (2认同)

Ant*_*hon 63

你实际上只问了一半的问题。另一个问题是,“为什么我要用 gzip 压缩 tar 文件?”。答案不仅仅是gzip使文件变小(在大多数情况下):

tar

  • 存储文件名和其他元数据:模式、所有者 ID、组 ID、文件大小、修改时间
  • 存储校验和(仅用于标头)

gzip

  • 可以存储原始文件名,但这是可选的
  • 对原始数据有一个 CRC-32 校验和
  • 它压缩文件

只有tar您无法确定您的数据没有损坏。只有gzip您无法恢复用户/组 ID、修改时间和可能不是原始文件名。

这种组合比单独的命令/格式提供的更强大,因为它们互补了彼此的功能


小智 30

仅使用 gzip 压缩的文本文件有一个很大的优势 - 可以使用less, zgrep,等命令行工具直接访问内容zcat

  • @underscore_d 我所有的数据库转储(主要是 mysql 和 pgsql)都是文本转储,部分是因为如果发生某些事情使转储部分损坏,它们更可挽救,部分是因为我可以使用常用工具(sed)预处理任何恢复、awk、perl 等),如果我需要的话。即比二进制转储更可靠和更有用。权衡是文本转储往往更大(谁在乎?磁盘空间便宜而且我们有很好的压缩)并且恢复速度要慢得多(但如果将恢复包装在事务中则更少)。 (9认同)

plu*_*ash 21

我想说的是,人们可能只是没有意识到他们可以在没有 tar 的情况下使用 gzip/ bzip2 / xz。可能是因为它们来自DOS /Windows 背景,在这种背景下,压缩和存档以单一格式(ZIPRAR等)集成是正常的。

由于元数据的存储或添加额外文件的能力,在某些情况下使用 tar 可能有一些优势,但也有缺点。使用普通的 gzip/bzip2/xz 文件,您可以解压缩它并将解压缩的数据直接传送到另一个工具(例如您的数据库),而无需将解压缩的数据作为文件存储在磁盘上。使用 tarball 这更难。

  • 对于使用 `tgz` 扩展名的文件,第一段似乎足够合理。然而,OP 的案例使用了“tar.gz”——如果这些假设的前 Win/DOS 用户和我一样,他们在查看这样的文件时说的第一句话是:“为什么它有 2 个扩展名?” . 然后他们在谷歌上搜索并很快得到了答案,其中特别说明了 `tar` 和压缩是不同的。;-) (5认同)
  • 使用 GNU tar,只需要 -O 开关即可输出到标准输出,所以我不会说它*更*难! (2认同)

ale*_*xis 18

tar在某些情况下使用important有一个重要的区别:除了@jofel 在他的回答中提到的“元数据”之外,还将tar 文件名记录在档案中。提取它时,无论存档名称如何,您都会获得原始文件名

在您的情况下,tar 存档及其包含的文件具有相关名称db.dump.tar.gzdb.tar,但假设您将 tar 文件重命名为20-Apr-16.dump.tgz,或其他名称。用 解压它tar xvfz,你就会得到db.dump. 为了进行比较,解压后20-Apr-16.dump.gz你就得到了20-Apr-16.dump. (编辑:正如评论中所指出的,gzip 还会记录文件名;但解压缩时通常不使用它)。一个tar存档也可以包含一个相对路径是放在一个子目录中提取的文件。

您的用例将决定这种文件名持久性是需要的,甚至是想要的,或者实际上是不受欢迎的。但可以肯定的是,无论压缩如何,tar存档的传输方式都与常规文件不同。

  • 是的。该名称在 gzip 标头中是可选的——显然,如果您压缩命令的流输出,则不会有一个名称——并且大多数工具默认不会恢复它(例如,您必须使用 `gzip --name`解压缩时明确),但您不必使用 tar 来获取文件名持久性。 (8认同)
  • gzip 还记录原始文件名。 (6认同)

Cri*_*gie 8

除了所有其他答案之外,我最近遇到了一种脚本编写情况,即只需要一个文件,但前任员工编写的脚本可能会生成多个文件。所以文件被 tar 和 bzipped,然后传输和扩展。

当进程增长到生成 4.3 GB 文件的程度时,它会翻转并生成 .dump.001 文件和 .dump 文件。所有的脚本都在继续工作。

这就是主动系统管理员懒惰的定义!