作为一名主要的 Windows 开发人员,也许我错过了 Linux 社区中的一些文化,但这一直让我感到困惑。

下载某些内容时,文件首先放入 .tar 然后存档 拉上拉链. 。为什么采用两步流程?没有 拉链 实现文件分组?还有其他我不知道的好处吗?

有帮助吗?

解决方案

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

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

其他提示

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

TAR文件只是文件内容与某些标题的串联,而gzip和bzip2是流压缩程序,在tarball中应用于整个连接。

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

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

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

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

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

如果它支持'-c'(对stdout,或从stdin)和'-d'(解压缩)选项,你也可以使用你选择的压缩器:

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

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

[已添加:如果要从gzipbzip2压缩文件中提取,GNU cpio会自动检测这些文件并运行相应的程序。也就是说,您可以使用:

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

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

与所选答案一样,分离的原因是职责分离。除此之外,这意味着人们可以使用'pack'程序打包文件(而不是compress),然后使用选择的压缩器(曾经一度,首选压缩器是zip,稍后它是-T -(它比-depth更有效),然后find围绕它的前辈发出响应,并且与rm -fr /new/place完全竞争(它已被移植到Unix,但不是原生的那里,现在<=>根据我的经验,它通常比<=>有10-20%的优势。

[添加:有人在回答中指出<=>有一些有趣的约定。这是真的,但是在GNU <=>得到相关选项('<=>')之前,当你不想存档给定目录下的所有东西时,<=>是更好的命令 - 你实际上可以选择哪个文件已存档。 <=>的缺点是,您不仅可以选择文件 - 您 选择它们。还有一个地方<=>分数;它可以从一个目录层次结构进行原位复制,而无需任何中间存储:

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

顺便提一下,<=>上的'<=>'选项在此上下文中很重要 - 它在设置目录本身的权限之前复制目录的内容。当我在输入此答案之前检查命令时,我复制了一些只读目录(555权限);当我去删除副本时,我必须在'<=>'完成之前放松对目录的权限。如果没有<=>选项,<=>命令将失败。当我去做清理时,我只记得这个 - 引用的公式对我来说是自动的(主要是凭借多年的多次重复)。 ]

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

在Unix世界中,大多数应用程序都是为了做一件事,并且做得很好。 Unix,gzip和bzip2中最流行的zip工具只进行文件压缩。 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

我认为原因是 仍然 使用 tar 今天的情况是,这是 UNIX 方法从一开始就完全正确的案例之一(可能是罕见的)。

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

  • 一个工具(tar 在这里给它一个名字)专门从事改造 任何 文件、目录和符号链接的选择,包括 全部 将时间戳、所有者和权限等相关元数据放入一个字节流中。

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

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

  • 可扩展性允许情侣 tar任何 压缩算法已经存在或 任何 压缩算法仍有待开发 没有 必须改变内部运作的任何东西 tar 根本不。

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

  • 稳定 tar 自 20 世纪 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 的受欢迎程度。

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

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

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

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

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

通常在* nux世界中,文件包作为tarball分发,然后可选择gzip。 Gzip是一个简单的文件压缩程序,它不执行tar或zip所做的文件捆绑。

曾经有一段时间,zip没有正确处理Unix tar和unix文件系统认为正常的一些事情,比如符号链接,混合大小写文件等等。我不知道是否改变了,但这就是我们使用的原因焦油。

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

GZip =压缩文件

他们将过程分为2.就是这样。

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

出于同样的原因,为什么mac用户喜欢磁盘映像:它们是一种非常方便的存档方式,然后传递,上传/下载或通过电子邮件发送等等。

比拉链恕我直言更容易使用,更便携。

在我的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 开发人员,这是可以理解的 压缩包 看起来很奇怪。这个单词 tar 代表磁带存档。想想卷盘式磁带录音机。

在 Windows 世界中,程序通常安装有 setup.exe 或者 install.exe 它在注册表中发挥各种作用,创建目录并安装 .dll (动态链接库)文件。

在 Linux 中,特别是根据我自己的经验,Ubuntu 中,包管理器负责获取应用程序并安装它 大多数时候. 。在 Ubuntu 中,开发人员创建一个以以下结尾的包 .deb (Debian,Ubuntu 的基础)。安装的基本语法 .deb 是:

sudo apt install <package_name>

虽然这对于用户来说相对简单,但对于开发人员来说创建一个 .deb 封装并关联 PPA。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top