作为一个主要的 Windows 开发人员,也许我在 Linux 社区中缺少一些文化,但它总是让我感到困惑。
下载文件时首先将文件放入.tar
存档然后压缩。为什么是两步过程?压缩不能实现文件分组吗?还有其他一些我不知道的好处吗?
bzip
并gzip
处理单个文件,而不是文件组。普通的旧zip
(和pkzip
)对文件组进行操作,并具有内置存档的概念。
*nix 哲学是可以很好地完成特定工作并且可以链接在一起的小工具之一。这就是为什么这里有两个具有特定任务的工具,它们旨在很好地结合在一起。这也意味着您可以使用 tar 对文件进行分组,然后您可以选择压缩工具(bzip
、gzip
等)。
一个重要的区别在于这两种档案的性质。
TAR 文件只不过是文件内容与一些标题的串联,而 gzip 和 bzip2 是流压缩器,在 tarball 中应用于整个串联。
ZIP 文件是单独压缩文件的串联,带有一些标题。实际上,zip 和 gzip 都使用 DEFLATE 算法,并且通过适当的二进制调整,您可以获取 gzip 流的有效负载并将其放入具有适当标题和字典条目的 zip 文件中。
这意味着两种不同的存档类型有不同的权衡。对于小文件的大集合,TAR 后跟流压缩器通常会导致比 ZIP 更高的压缩率,因为流压缩器将有更多的数据来构建其字典频率,因此能够挤出更多的冗余信息。另一方面,ZIP 文件中的(文件长度保留)错误只会损坏那些压缩数据受到影响的文件。通常,流压缩器无法从流中的错误中有意义地恢复。因此,ZIP 文件更能抵御损坏,因为存档的一部分仍然可以访问。
奇怪的是,没有人提到现代版本的 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 ...
这将允许您指定任何替代压缩器。
[补充:如果您从文件中提取gzip
或bzip2
压缩文件,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
命令将失败。我只是在进行清理时才重新记住这一点-引用的公式对我来说是自动的(主要是由于多年来的多次重复)。]
有趣的是,你可以得到tar
and的创建者没有预料到的行为gzip
。例如,您不仅可以 gzip 一个 tar 文件,还可以 tar gzip 压缩的文件,以生成一个files.gz.tar
(从技术上讲,这将更接近工作方式pkzip
)。或者您可以将另一个程序放入管道中,例如一些密码学,您可以选择任意顺序的 tarring、gzipping 和加密。编写密码学程序的人不必对他的程序将如何使用有丝毫的想法,他所要做的就是从标准输入读取并写入标准输出。
在 Unix 世界中,大多数应用程序都被设计为只做一件事,并且做得很好。Unix 中最流行的 zip 实用程序 gzip 和 bzip2 只进行文件压缩。tar 进行文件连接。将 tar 的输出通过管道传输到压缩实用程序中可以满足需要,而不会增加任何软件的过度复杂性。
它如此流行的另一个原因是 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) 上的记忆。
我认为您正在寻找更多的历史背景。原始 zip 用于单个文件。Tar 用于将多个文件放入一个文件中。因此,tarring 和 zipping 是两步过程。为什么它今天仍然如此占主导地位是任何人的猜测。
来自维基百科的Tar_ (file_format)
在计算中,tar(源自磁带存档)既是一种文件格式(以一种存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由 POSIX.1-1988 和后来的 POSIX.1-2001 标准化。最初作为一种原始格式开发,用于磁带备份和其他用于备份目的的顺序访问设备,现在它通常用于将文件集合整理成一个更大的文件,用于分发或归档,同时保留文件系统信息,例如用户和组权限、日期和目录结构。
在我看来,今天仍在使用的原因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
.
tar之所以流行,主要是出于历史原因。有几种现成的替代方案。其中一些存在的时间几乎与 tar 一样长,但由于几个原因,它们的受欢迎程度无法超过 tar。
tar 的一个主要优点(和缺点)是它既没有文件头,也没有内容的中央目录。因此,多年来,它从未受到文件大小的限制(直到这十年,档案内文件的 8 Gb 限制成为一个问题,几年前解决了)。
显然 tar.gz (或 ar.Z )的一个缺点,即您必须解压缩整个存档以提取单个文件并列出存档内容,永远不会伤害到足以使他们大量从 tar 中脱离的人.
gzip 和 bzip2 只是一个压缩器,而不是一个归档软件。因此,组合。您需要 tar 软件来捆绑所有文件。
ZIP 本身和 RAR 也是这两个过程的组合。
通常在 *nux 世界中,文件包以 tarball 的形式分发,然后可选地进行 gzip 压缩。Gzip 是一个简单的文件压缩程序,它不像 tar 或 zip 那样进行文件捆绑。
曾几何时,zip 无法正确处理 Unix tar 和 unix 文件系统认为正常的一些事情,例如符号链接、大小写混合文件等。我不知道这是否发生了变化,但这就是我们使用 tar 的原因。
Tar = 将文件分组到 1 个文件中
GZip = 压缩文件
他们将过程分成两部分。就是这样。
在 Windows 环境中,您可能更习惯使用执行 Zip 的 WinZip 或 WinRar。这些软件的 Zip 进程确实对文件进行分组和压缩,但您根本看不到该进程。
与 mac 用户喜欢磁盘映像的原因相同:它们是一种非常方便的方式来存档内容,然后将其传递、上传/下载或通过电子邮件发送等。
并且比 zips 恕我直言,更易于使用且更便携。
在我的 Altos-XENIX 时代(1982 年),我们开始使用 tar(磁带存档器)从 5 1/4 软盘或流式磁带中提取文件并复制到这些媒体。它的功能非常类似于 DOS 5.0 和 6.22 中的 BACKUP.EXE 和 RESTORE.EXE 命令作为补充,如果它不能只适合一个媒体,则允许您跨越多个媒体。缺点是,如果多个媒体中的一个出现问题,整个事情就一文不值。tar 和 dd 源自 UNIX SYStem III,可能出于向后兼容性的原因,它仍然是类 UNIX 操作系统的标准发布实用程序。
Tar 不仅是一种文件格式,而且是一种磁带格式。磁带逐位存储数据。每个存储实现都是自定义的。Tar 是一种方法,您可以通过这种方法从磁盘中取出数据,并将其存储到磁带上,这样其他人无需您的自定义程序即可检索它。
后来,压缩程序出现了,*nix 仍然只有一种方法可以创建包含多个文件的单个文件。
我相信这只是惯性,随着 tar.gz 趋势的延续。Pkzip 一举开始同时进行压缩和归档,但是 DOS 系统通常没有连接磁带驱动器!
来自维基百科的 Tar_ (file_format)
在计算中,tar(源自磁带存档)既是一种文件格式(以一种存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由 POSIX.1-1988 和后来的 POSIX.1-2001 标准化。最初作为一种原始格式开发,用于磁带备份和其他用于备份目的的顺序访问设备,现在它通常用于将文件集合整理成一个更大的文件,用于分发或归档,同时保留文件系统信息,例如用户和组权限、日期和目录结构。
作为一名 Windows 开发人员, tarball看起来很奇怪是可以理解的。这个词tar
代表磁带存档。想想卷对卷磁带录音机。
在 Windows 世界中,程序通常安装有setup.exe
或install.exe
在注册表中运行各种巫术,创建目录和安装.dll
(动态链接库)文件。
在 Linux 中,尤其是 Ubuntu,根据我自己的经验,包管理器大部分时间都负责获取应用程序并安装它。在 Ubuntu 中,开发人员创建了一个以.deb
(Debian,Ubuntu 所基于)结尾的包。安装 a 的基本语法.deb
是:
sudo apt install <package_name>
尽管这对用户来说相对简单,但开发人员创建.deb
包和关联 PPA 需要做很多工作。
对于开发人员来说,一种更简单的方法是创建一个 tarball。然后安装的负担由最终用户分担。他们一定:
.tar.gz
)。apt
可以备份的数据库(想想 Windows 安装的程序列表)。正如您提出的另一个问题的另一个答案已经说明的那样,您可以同时创建一个 tarball 并压缩数据。不需要两次通过过程。