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


101

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

归档单个文件有什么意义,还是.tar.gz这样一个常见的习惯?为什么不只是.gz呢?


5
我认为这只是一个惯例问题。当人们看到带有gz扩展名的文件时,他们的默认思路是使用tar -zxvf。但是对于那些看了文件名却没有.tgz扩展名的人,gzip db dump文件是非常好的。由于我不了解压缩算法的详细信息,因此我不确定tar是否对稀疏文件(例如db dump)进行任何压缩,但是对于纯文本文件,直接gzip压缩文件比先进行tar压缩和gzip压缩具有很小的尺寸优势读取文件
MelBurslan '16

3
对单个文件进行压缩只会在文件的开头和结尾添加一些元数据块。实际的文件数据通过tar传递到未压缩的压缩器。因此,对于大文件,纯压缩和去皮重之间的大小差异可以忽略不计。
plugwash '16

过去尝试各种压缩方法时,我发现.tar.gz其优于大多数其他常用方法。我记得它比正义更好,.tar但不记得它是否比正义更好.gz。具有讽刺意味的是,Window的.cab格式是我尝试过的最好的方法,这是非常意外的。
法拉普16-4-25的

@Pharap tar不是压缩算法,它是一种归档格式
gardenhead

1
@gardenhead嗯,这可以解释为什么它不能很好地工作。
法拉普2016年

Answers:


163

使用.tar.gz代替的优点.gz

  • tar存储的元数据多于(UNIX权限等)gzip
  • 可以更轻松地扩展设置以存储多个文件
  • .tar.gz文件非常常见,仅压缩文件可能会使某些用户感到困惑。(请参阅 MelBurslans评论

使用的开销tar也很小。

如果不是真的需要,我仍然不建议将tar文件压缩为tar。有许多有用的工具可以直接访问压缩的单个文件(例如和zcatzgrep也存在于bzip2和中xz)。


35
我没有考虑元数据方面。很好的一点
gardenhead '16

5
如果看到a .gz,我的第一个直觉就是tar -zxf foo.gz。记住gzip甚至是一个命令,还需要花费几秒钟的时间。
bgStack15 '16

2
@ bgStack15 FWIW您不需要z(或-就此而言),大多数现代tar的都会自动检测到需要解压缩的文件。
drewbenn '16

2
默认情况下gzip将存储原始文件名和时间戳。您可以-N在解压缩时使用该选项来还原它们。
Ross Ridge)

@RossRidge,谢谢,我再次删除了有关原始文件名的文字。
jofel

63

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

tar

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

gzip

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

仅使用tar您无法确定您的数据没有损坏。仅使用gzip您无法恢复用户/组ID,修改时间,还可能无法恢复原始文件名。

组合比单独的命令/格式提供的功能更强大,因为它们可以相互补充


感谢您的澄清!当我阅读tarWikipedia页面时,我误解了描述,以表示校验和是针对整个文件的。
gardenhead 2016年

在我看来,这是正确的答案。我还要添加一些其他原因,如果您同意的话,可能需要编辑。1).tgz相对于.tar或.gz而言,.tgz的管理员无需支付额外费用:它们全都是一个命令。2)出于许多不同的原因,管理员备份,复制,重定位,移动很多文件;数据库备份只是其中之一。他们可以使用相同的工作流程,工具和命令来备份一个或多个文件。那么,对于只有一个文件的情况,为什么还要特殊地使用gzip命令的语法呢?
Dewi Morgan

30

有一个相当大的优势,使用仅-gzip压缩的文本文件-的内容可以用命令行工具,如直接访问lesszgrepzcat


有趣的一点是,但问题是有关数据库快照的,不太可能是文本文件,而不仅仅是压缩的。
underscore_d

9
@underscore_d我所有的数据库转储(主要是mysql和pgsql)都是文本转储,部分是因为如果发生部分损坏转储的情况,它们更易于保存,部分是因为我可以使用常用工具进行预处理(sed ,awk,perl等)(如果需要)。即比二进制转储更可靠,更有用。需要权衡的是,文本转储往往更大(谁在乎呢?磁盘空间很便宜并且我们拥有良好的压缩能力),而还原则要慢得多(但是如果将还原包装在事务中,则还原速度会慢得多)。
cas

1
这些工具相对于将解压缩器的输出简单地传递到普通工具中有什么优势?
CodesInChaos

21

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

尽管由于元数据的存储或添加额外文件的能力,在某些情况下使用tar可能会有一点优势,但也有一些缺点。使用纯gzip / bzip2 / xz文件,您可以对其进行解压缩并将解压缩后的数据直接传输到另一个工具(例如您的数据库),而不必将解压缩后的数据作为文件存储在磁盘上。使用tarball会更困难。


2
使用GNU tar,只需-O开关即可输出到stdout,所以我不会说困难得多!
hyde

5
对于使用tgz扩展名的文件,第一段似乎很合理。但是,OP的使用情况是tar.gz-如果这些假设的Win-DOS / DOS前用户像我一样,则他们在查看此类文件时首先说的是:“为什么有2个扩展名?”。然后他们用谷歌搜索并迅速得到答案,这特别说明了tar压缩和压缩是不同的。;-)
underscore_d

17

tar在某些情况下,使用时可能会有重要的区别:除了@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存档文件的传输方式与常规文件都不相同。


6
gzip还会记录原始文件名。
psusi '16

8
对。该名称在gzip标头中是可选的-显然,如果压缩命令的流输出,将不会有该名称-并且大多数工具默认不会还原它(例如,gzip --name在解压缩时必须显式使用),但是您不必使用tar来获取文件名的持久性。
2016年

感谢您指出这一点,我还不知道。但是,由于这不是默认行为,因此可以说明这一点:以tar格式分发文件将保留原始文件名(可能还有相对路径),而无需收件人的干预。不能分发(g)压缩文件。
alexis

8

除了所有其他答案之外,我最近遇到了一种脚本编写情况,即只需要一个文件,但是前一位员工编写了脚本,并可能生成多个文件。因此,文件被脱脂并压缩后,再传输并扩展。

当该过程发展到制作4.3 GB文件的程度时,除了.dump文件外,它还翻转并制作了.dump.001文件。所有脚本都保持正常运行。

这就是定义的主动sysadmin懒惰!


2

我会压缩单个文件,以复制它以保留时间戳(在下载中很容易忽略)。文件权限和所有权不太重要:下载是一个术语,适用于集成程度不高的系统。

无论是否已压缩,通常的做法都是压缩文件以加快下载速度,并避免用尽磁盘空间。


-1

Tar对于一直没有写入正式文件系统的多个文件特别有用。如果出于某种原因有时仅写入一个文件,则没有任何实际意义。我可以将.tar.gz直接dd / dev / sdx而不用考虑分区或文件系统。也可能是胶带。

通常这样做是因为脚本或过程已从继承代码复制而来。当然,如果只有一个文件,则无需tar,但是它为增强多个文件留有余地……

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.