在下载文件时,文件首先被放入一个.tar归档文件,然后再进行压缩。为什么要这样做呢?难道压缩不可以实现文件分组吗?还有其他我不知道的好处吗?
bzip
和gzip
只适用于单个文件,而不是多个文件。普通的zip
(和pkzip
)则可操作多个文件,并内置档案概念。
*nix哲学主张使用专业工具完成特定任务并且这些工具可以相互衔接。因此这里有两种具有特定任务的工具,它们被设计成互补匹配的。这也意味着您可以使用tar来组织文件,然后选择压缩工具(bzip
、gzip
等)。tar
存档的(我认为)整个重点:支持Linux文件系统权限。如果你下载了一个Debian软件包,你的软件包管理器安装了它,但是所有可执行文件都无法执行,那会发生什么?这才是每个人使用tarball的真正原因...;) - JamesTheAwesomeDude两种不同类型的压缩文件有一个重要区别。
TAR文件实质上只是一些头部信息和文件内容的串联,而gzip和bzip2则是流压缩器,应用于整个串联的tarballs文件中。
ZIP文件是许多经过单独压缩的文件的串联,同时含有一些头部信息。实际上,DEFLATE算法被zip和gzip都采用,通过适当的二进制调整,你可以将gzip流的有效负载放入zip文件中,并加入适当的头部和字典条目。
这意味着这两种不同的归档类型具有不同的权衡。对于大量小文件的集合,TAR后跟流压缩器通常会比ZIP具有更高的压缩比,因为流压缩器将有更多数据来构建其字典频率,从而能够挤出更多的冗余信息。另一方面,ZIP文件中的(保持文件长度的)错误只会破坏那些受到影响的压缩数据文件。通常,流压缩器不能从流的中段有意义地恢复错误。因此,ZIP文件更具有抗损耗性,因为部分归档仍然可以被访问。
很奇怪没有人提到现代版本的GNU tar
可以在打包时进行压缩:
tar -czf output.tar.gz directory1 ...
tar -cjf output.tar.bz2 directory2 ...
你也可以使用你选择的压缩器,只要它支持 '-c
'(输出到标准输出或从标准输入读取)和'-d
'(解压缩)选项:
tar -cf output.tar.xxx --use-compress-program=xxx directory1 ...
这将允许您指定任何替代压缩程序。
[添加:如果您从gzip
或bzip2
压缩文件中提取,GNU tar
会自动检测并运行适当的程序。也就是说,您可以使用:
tar -xf output.tar.gz
tar -xf output.tgz # A synonym for the .tar.gz extension
tar -xf output.tar.bz2
这些将被正确处理。如果您使用非标准压缩程序,则需要在提取时指定。
分离的原因如所选答案中所述,是责任的分离。除其他事项外,这意味着人们可以使用“cpio”程序来打包文件(而不是“tar”),然后使用所选择的压缩程序(曾经,首选的压缩程序是“pack”,后来是比“pack”更有效的“compress”,然后是“gzip”,它完全可以与“zip”竞争(已被移植到Unix,但在那里不是本地程序),现在是“bzip2”,在我的经验中,通常比“gzip”优越10-20%。
[添加:有人在他们的答案中指出,cpio有一些奇怪的约定。这是真的,但在GNU tar获得相关选项(“-T -”)之前,当您不想归档给定目录下面的所有内容时,cpio是更好的命令--您实际上可以选择要存档的确切文件。 cpio的缺点是您不仅可以选择文件--您必须选择它们。 cpio仍然有一个地方可以得分;它可以在没有任何中间存储的情况下从一个目录层次结构复制到另一个目录层次结构中:
cd /old/location; find . -depth -print | cpio -pvdumB /new/place
find
上的'-depth
'选项非常重要——它会在设置目录权限之前复制目录的内容。当我在输入答案之前检查命令时,我复制了一些只读目录(555权限);当我去删除副本时,我不得不放松目录的权限,然后'rm -fr /new/place
'才能完成。如果没有使用-depth
选项,cpio
命令将失败。当我去清理时,我才重新记起这一点——这个公式对我来说已经非常自然(主要是因为多年来反复练习)。tar
和 gzip
的创建者预料到的行为。例如,您不仅可以对 tar 文件进行 gzip 压缩,还可以对已经压缩过的文件进行打包,生成一个 files.gz.tar
文件(这在技术层面上更接近于 pkzip
的工作方式)。或者您可以将另一个程序放入管道中,例如一些加密程序,并且可以选择任意顺序的打包、压缩和加密操作。编写加密程序的人根本不需要知道他的程序会被如何使用,他只需要从标准输入读取数据,然后将加密结果写入标准输出即可。GNU tar还允许您通过一个命令(一个步骤)创建/提取这些文件:
tar -cfvj destination.tar.bz2 *.files
tar -cfvz destination.tar.gz *.files
提取存档:(-C部分是可选的,默认为当前目录)
tar -xfvj archive.tar.bz2 -C destination_path
tar -xfvz archive.tar.gz -C destination_path
这些都是我从我的多年Linux和最近的Nexenta(OpenSolaris)记忆中记住的。
我认为今天仍然使用tar的原因是它是UNIX哲学的杰作,从一开始就完美地实现了不同任务的分离。
仔细观察创建存档所涉及的各个阶段,您会发现这里分离不同任务的方式是UNIX哲学的最佳体现:
一个工具(在这里称为tar)专门用于将任何选择的文件、目录和符号链接,包括所有相关元数据(如时间戳、所有者和权限),转换为一个字节流。
另一个可以任意交换的工具(gzip、bz2、xz等)将任何输入字节流转换为另一个(希望更小的)输出字节流。
采用这种方法为用户和开发人员带来了许多好处:
可扩展性 允许将tar与任何现有的或尚未开发的压缩算法耦合,而无需对tar的内部工作进行任何更改。 一旦全新的“超级zip-utra”或其他压缩工具推出,您已经准备好使用它,利用tar的全部功能。
稳定性 tar从80年代初以来一直在大规模使用,经过了多个操作系统和机器的测试和运行。 在实现存储所有权、权限、时间戳等方面不需要反复发明轮子,不仅节省了开发时间(否则会浪费大量时间),而且为每个新应用程序提供了相同的可靠性。
一致性 用户界面始终保持不变。
无需记住使用工具A恢复权限时必须传递选项--i-hope-you-rember-this-one,使用工具B时必须使用--this-time-its-another-one,而使用工具C时是`--hope-you-didnt-try-with-tool-as-switch。 而在利用工具D时,如果您没有使用--if-you-had-used-tool-bs-switch-your-files-would-have-been-deleted-now,那么您将真正搞砸它。tar因历史原因而广受欢迎。现在有几种替代品可供选择。其中一些存在的时间与tar几乎一样长,但由于某些原因无法超越tar的流行。
tar的一个主要优点(和缺点)是它既没有文件头,也没有内容的中央目录。因此多年来它从未受到文件大小限制的影响(直到这个十年,在存档中8 Gb文件的限制成为问题,已经解决多年)。
显然,tar.gz(或者ar.Z)唯一的缺点是你必须解压整个归档才能提取单个文件和列出归档内容,但这从未对足够多的人造成伤害,使他们大量转向其他工具。
gzip和bzip2只是压缩软件,而不是打包软件。因此需要结合使用。您需要tar软件来捆绑所有文件。
ZIP本身以及RAR也是这两个过程的组合。