90

作为一个主要的 Windows 开发人员,也许我在 Linux 社区中缺少一些文化,但它总是让我感到困惑。

下载文件时首先将文件放入.tar存档然后压缩。为什么是两步过程?压缩不能实现文件分组吗?还有其他一些我不知道的好处吗?

4

16 回答 16

138

bzipgzip处理单个文件,而不是文件组。普通的旧zip(和pkzip)对文件组进行操作,并具有内置存档的概念。

*nix 哲学是可以很好地完成特定工作并且可以链接在一起的小工具之一。这就是为什么这里有两个具有特定任务的工具,它们旨在很好地结合在一起。这也意味着您可以使用 tar 对文件进行分组,然后您可以选择压缩工具(bzipgzip等)。

于 2008-11-17T15:27:38.357 回答
30

一个重要的区别在于这两种档案的性质。

TAR 文件只不过是文件内容与一些标题的串联,而 gzip 和 bzip2 是流压缩器,在 tarball 中应用于整个串联。

ZIP 文件是单独压缩文件的串联,带有一些标题。实际上,zip 和 gzip 都使用 DEFLATE 算法,并且通过适当的二进制调整,您可以获取 gzip 流的有效负载并将其放入具有适当标题和字典条目的 zip 文件中。

这意味着两种不同的存档类型有不同的权衡。对于小文件的大集合,TAR 后跟流压缩器通常会导致比 ZIP 更高的压缩率,因为流压缩器将有更多的数据来构建其字典频率,因此能够挤出更多的冗余信息。另一方面,ZIP 文件中的(文件长度保留)错误只会损坏那些压缩数据受到影响的文件。通常,流压缩器无法从流中的错误中有意义地恢复。因此,ZIP 文件更能抵御损坏,因为存档的一部分仍然可以访问。

于 2008-11-17T15:49:29.360 回答
26

奇怪的是,没有人提到现代版本的 GNUtar允许您在捆绑时进行压缩:

tar -czf output.tar.gz directory1 ...

tar -cjf output.tar.bz2 directory2 ...

您还可以使用您选择的压缩器,只要它支持“ -c”(到标准输出,或从标准输入)和“ -d”(解压缩)选项:

tar -cf output.tar.xxx --use-compress-program=xxx directory1 ...

这将允许您指定任何替代压缩器。

[补充:如果您从文件中提取gzipbzip2压缩文件,GNUtar会自动检测这些文件并运行适当的程序。也就是说,您可以使用:

tar -xf output.tar.gz
tar -xf output.tgz        # A synonym for the .tar.gz extension
tar -xf output.tar.bz2

这些都会得到妥善处理。如果您使用非标准压缩器,则需要在提取时指定。]

与所选答案一样,分离的原因是职责分离。除此之外,这意味着人们可以使用 ' cpio' 程序来打包文件(而不是tar),然后使用选择的压缩器(曾几何时,首选压缩器是pack,后来它是compress(比pack),然后gzip它围绕着它的两个前辈运行,并且与zip(它已被移植到 Unix,但不是本地的)完全竞争,现在bzip2,根据我的经验,它通常比gzip.

[补充:有人在他们的回答中指出了cpio有趣的约定。确实如此,但是在 GNUtar获得相关选项(' -T -')之前,cpio当您不想归档给定目录下的所有内容时,这是更好的命令——您实际上可以准确地选择要归档的文件。缺点cpio是你不仅可以选择文件——你必须选择它们。还有一个地方可以cpio得分;它可以从一个目录层次结构原位复制到另一个目录层次结构,而无需任何中间存储:

cd /old/location; find . -depth -print | cpio -pvdumB /new/place

顺便说一句,在这种情况下,' -depth' 选项find很重要 - 它会在设置目录本身的权限之前复制目录的内容。当我在输入这个答案之前检查命令时,我复制了一些只读目录(555权限);当我去删除副本时,我必须在 ' rm -fr /new/place' 完成之前放宽目录的权限。如果没有该-depth选项,该cpio命令将失败。我只是在进行清理时才重新记住这一点-引用的公式对我来说是自动的(主要是由于多年来的多次重复)。]

于 2008-11-17T15:41:44.070 回答
15

有趣的是,你可以得到tarand的创建者没有预料到的行为gzip。例如,您不仅可以 gzip 一个 tar 文件,还可以 tar gzip 压缩的文件,以生成一个files.gz.tar(从技术上讲,这将更接近工作方式pkzip)。或者您可以将另一个程序放入管道中,例如一些密码学,您可以选择任意顺序的 tarring、gzipping 和加密。编写密码学程序的人不必对他的程序将如何使用有丝毫的想法,他所要做的就是从标准输入读取并写入标准输出。

于 2008-11-17T19:46:03.640 回答
9

在 Unix 世界中,大多数应用程序都被设计为只做一件事,并且做得很好。Unix 中最流行的 zip 实用程序 gzip 和 bzip2 只进行文件压缩。tar 进行文件连接。将 tar 的输出通过管道传输到压缩实用程序中可以满足需要,而不会增加任何软件的过度复杂性。

于 2008-11-17T15:31:10.677 回答
7

它如此流行的另一个原因是 tar 和 gzip 几乎存在于整个 *NIX 安装基础上。我相信这可能是最大的原因。这也是 zip 文件在 Windows 上非常流行的原因,因为无论 RAR 或 7z 中的高级例程如何,都内置了支持。

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) 上的记忆。

于 2008-11-17T16:14:09.840 回答
5

我认为您正在寻找更多的历史背景。原始 zip 用于单个文件。Tar 用于将多个文件放入一个文件中。因此,tarring 和 zipping 是两步过程。为什么它今天仍然如此占主导地位是任何人的猜测。

来自维基百科的Tar_ (file_format)

在计算中,tar(源自磁带存档)既是一种文件格式(以一种存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由 POSIX.1-1988 和后来的 POSIX.1-2001 标准化。最初作为一种原始格式开发,用于磁带备份和其他用于备份目的的顺序访问设备,现在它通常用于将文件集合整理成一个更大的文件,用于分发或归档,同时保留文件系统信息,例如用户和组权限、日期和目录结构。

于 2008-11-17T15:34:11.950 回答
4

tar 是 UNIX,因为 UNIX 是 tar

在我看来,今天仍在使用的原因tar是它是(可能很少见的)UNIX 方法从一开始就完美正确的情况之一。

仔细看看创建档案所涉及的各个阶段,我希望您会同意,在这里分离不同任务的方式是UNIX 哲学的最佳表现:

  • 一个工具(tar在这里给它一个名字)专门用于将任何选择的文件、目录和符号链接(包括所有相关的元数据,如时间戳、所有者和权限)转换为一个字节流。

  • 并且只是另一个可任意互换的工具(gzip bz2 xz仅举几个选项),它将任何输入字节流转换为另一个(希望)更小的输出流。

使用这种方法为用户和开发人员带来了一系列好处:

  • 可扩展性 允许tar任何已经存在的压缩算法或任何尚待开发的压缩算法相结合,而无需对内部工作进行任何更改tar

    一旦全新的“hyper-zip-utra”或其他压缩工具问世,您就已经准备好使用它来拥抱您的新仆从tar.

  • 自 80 年代初以来,稳定性 tar一直在大量使用,并在许多操作系统和机器上进行了测试和运行。

    避免在为每个新的归档工具一次又一次地实现存储所有权、权限、时间戳等方面重新发明轮子的需要,不仅节省了大量(否则不必要地花费)的开发时间,而且还保证了每个新归档工具的相同可靠性新的应用程序。

  • 一致性用户界面始终保持不变。

    无需记住,要使用工具 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.

于 2013-03-19T03:39:57.217 回答
3

tar之所以流行,主要是出于历史原因。有几种现成的替代方案。其中一些存在的时间几乎与 tar 一样长,但由于几个原因,它们的受欢迎程度无法超过 tar。

  • cpio(异形语法;理论上更一致,但人们喜欢他们所知道的,tar 占了上风)
  • ar(很久以前流行,现在用来打包库文件)
  • shar(自解压shell脚本,有各种各样的问题;曾经很流行)
  • zip(由于许可问题,它在许多 Unices 上并不容易获得)

tar 的一个主要优点(和缺点)是它既没有文件头,也没有内容的中央目录。因此,多年来,它从未受到文件大小的限制(直到这十年,档案内文件的 8 Gb 限制成为一个问题,几年前解决了)。

显然 tar.gz (或 ar.Z )的一个缺点,即您必须解压缩整个存档以提取单个文件并列出存档内容,永远不会伤害到足以使他们大量从 tar 中脱离的人.

于 2008-11-17T17:07:21.917 回答
2

gzip 和 bzip2 只是一个压缩器,而不是一个归档软件。因此,组合。您需要 tar 软件来捆绑所有文件。

ZIP 本身和 RAR 也是这两个过程的组合。

于 2008-11-17T15:28:48.853 回答
2

通常在 *nux 世界中,文件包以 tarball 的形式分发,然后可选地进行 gzip 压缩。Gzip 是一个简单的文件压缩程序,它不像 tar 或 zip 那样进行文件捆绑。

曾几何时,zip 无法正确处理 Unix tar 和 unix 文件系统认为正常的一些事情,例如符号链接、大小写混合文件等。我不知道这是否发生了变化,但这就是我们使用 tar 的原因。

于 2008-11-17T15:29:21.570 回答
1

Tar = 将文件分组到 1 个文件中

GZip = 压缩文件

他们将过程分成两部分。就是这样。

在 Windows 环境中,您可能更习惯使用执行 Zip 的 WinZip 或 WinRar。这些软件的 Zip 进程确实对文件进行分组和压缩,但您根本看不到该进程。

于 2008-11-17T15:27:48.887 回答
1

与 mac 用户喜欢磁盘映像的原因相同:它们是一种非常方便的方式来存档内容,然后将其传递、上传/下载或通过电子邮件发送等。

并且比 zips 恕我直言,更易于使用且更便携。

于 2009-06-09T18:18:35.640 回答
1

在我的 Altos-XENIX 时代(1982 年),我们开始使用 tar(磁带存档器)从 5 1/4 软盘或流式磁带中提取文件并复制到这些媒体。它的功能非常类似于 DOS 5.0 和 6.22 中的 BACKUP.EXE 和 RESTORE.EXE 命令作为补充,如果它不能只适合一个媒体,则允许您跨越多个媒体。缺点是,如果多个媒体中的一个出现问题,整个事情就一文不值。tar 和 dd 源自 UNIX SYStem III,可能出于向后兼容性的原因,它仍然是类 UNIX 操作系统的标准发布实用程序。

于 2010-06-27T05:23:08.400 回答
0

Tar 不仅是一种文件格式,而且是一种磁带格式。磁带逐位存储数据。每个存储实现都是自定义的。Tar 是一种方法,您可以通过这种方法从磁盘中取出数据,并将其存储到磁带上,这样其他人无需您的自定义程序即可检索它。

后来,压缩程序出现了,*nix 仍然只有一种方法可以创建包含多个文件的单个文件。

我相信这只是惯性,随着 tar.gz 趋势的延续。Pkzip 一举开始同时进行压缩和归档,但是 DOS 系统通常没有连接磁带驱动器!

来自维基百科的 Tar_ (file_format)

在计算中,tar(源自磁带存档)既是一种文件格式(以一种存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由 POSIX.1-1988 和后来的 POSIX.1-2001 标准化。最初作为一种原始格式开发,用于磁带备份和其他用于备份目的的顺序访问设备,现在它通常用于将文件集合整理成一个更大的文件,用于分发或归档,同时保留文件系统信息,例如用户和组权限、日期和目录结构。

于 2008-11-17T18:53:30.940 回答
0

作为一名 Windows 开发人员, tarball看起来很奇怪是可以理解的。这个词tar代表磁带存档。想想卷对卷磁带录音机。

在 Windows 世界中,程序通常安装有setup.exeinstall.exe在注册表中运行各种巫术,创建目录和安装.dll(动态链接库)文件。

在 Linux 中,尤其是 Ubuntu,根据我自己的经验,包管理器大部分时间都负责获取应用程序并安装它。在 Ubuntu 中,开发人员创建了一个以.deb(Debian,Ubuntu 所基于)结尾的包。安装 a 的基本语法.deb是:

sudo apt install <package_name>

尽管这对用户来说相对简单,但开发人员创建.deb包和关联 PPA 需要做很多工作。

对于开发人员来说,一种更简单的方法是创建一个 tarball。然后安装的负担由最终用户分担。他们一定:

  • 下载 tarball(通常以 结尾.tar.gz)。
  • 将源代码解压到一个目录。
  • 编译源代码(在 Windows for Profit 世界中闻所未闻)。
  • 希望写下他们所做的事情,以防他们将来需要重复,因为没有apt可以备份的数据库(想想 Windows 安装的程序列表)。

正如您提出的另一个问题的另一个答案已经说明的那样,您可以同时创建一个 tarball 并压缩数据。不需要两次通过过程。

于 2018-04-25T00:29:24.593 回答