作为一名主要的Windows开发人员,也许我在Linux社区中遗漏了一些文化,但它总是让我感到困惑。
下载文件首先放入.tar
存档的内容时,压缩。为什么两步过程? 压缩不实现文件分组吗?还有其他一些我不知道的好处吗?
答案 0 :(得分:133)
bzip
和gzip
处理单个文件,而不是文件组。普通旧zip
(和pkzip
)对文件组进行操作,并具有内置存档的概念。
* nix哲学是能够很好地完成特定工作并且可以链接在一起的小工具之一。这就是为什么这里有两个具有特定任务的工具,它们的设计非常适合。这也意味着您可以使用tar对文件进行分组,然后您可以选择压缩工具(bzip
,gzip
等)。
答案 1 :(得分:28)
一个重要的区别在于两种档案的性质。
TAR文件只是文件内容与某些标题的串联,而gzip和bzip2是流压缩程序,在tarball中应用于整个连接。
ZIP文件是单独压缩文件的串联,带有一些标题。实际上,zip和gzip都使用DEFLATE算法,并且通过适当的二进制调整,您可以获取gzip流的有效负载并将其放入带有相应头和词典条目的zip文件中。
这意味着两种不同的存档类型具有不同的权衡。对于大型小文件集合,TAR后跟流压缩器通常会产生比ZIP更高的压缩比,因为流压缩器将有更多数据来构建其字典频率,从而能够挤出更多冗余信息。另一方面,ZIP文件中的(文件长度保留)错误只会破坏压缩数据受影响的文件。通常,流压缩器无法从流中错误中有意义地恢复。因此,ZIP文件更容易受到损坏,因为存档的一部分仍然可以访问。
答案 2 :(得分:26)
奇怪的是,没有人提到现代版本的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 ...
这将允许您指定任何替代压缩器。
[已添加:如果要从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
),然后使用选择的压缩器(曾经一度,首选的压缩器是{ {1}},后来它是pack
(比compress
更有效),然后pack
围绕它的两个前辈发出响应,并且与{{1}完全竞争(已移植到Unix,但不是原生的),现在gzip
,根据我的经验,它通常比zip
有10-20%的优势。
[添加:有人在答案中注明bzip2
有一些有趣的约定。这是真的,但是在GNU gzip
获得相关选项('cpio
')之前,当您不想存档给定目录下的所有内容时,tar
是更好的命令 - 您实际上可以准确选择归档的文件。 -T -
的缺点是你不仅可以选择文件 - 你有来选择它们。还有一个地方cpio
得分;它可以从一个目录层次结构进行原位复制,而无需任何中间存储:
cpio
顺便提一下,cpio
上的{cd /old/location; find . -depth -print | cpio -pvdumB /new/place
选项在此上下文中很重要 - 它在设置目录本身的权限之前复制目录的内容。当我在输入此答案之前检查命令时,我复制了一些只读目录(555权限);当我去删除副本时,我必须在'-depth
'完成之前放松对目录的权限。如果没有find
选项,rm -fr /new/place
命令将失败。当我去做清理工作时,我只记得这个 - 引用的公式对我来说是自动的(主要是凭借多年的重复次数)。
]
答案 3 :(得分:15)
有趣的是,您可以获得tar
和gzip
的创作者未预料到的行为。例如,您不仅可以gzip tar文件,还可以tar gzipped文件,以生成files.gz.tar
(这在技术上更接近pkzip
的工作方式)。或者你可以将另一个程序放入管道,例如一些加密,你可以选择任意顺序的tarring,gzipping和encrypting。编写密码学程序的人不必知道如何使用他的程序,他需要做的就是从标准输入读取并写入标准输出。
答案 4 :(得分:8)
在Unix世界中,大多数应用程序都是为了做一件事,而且做得很好。 Unix,gzip和bzip2中最流行的zip工具只进行文件压缩。 tar执行文件串联。将tar输出管道化为压缩实用程序可以满足需要,而不会给任何一个软件增加过多的复杂性。
答案 5 :(得分: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)上的记忆。
答案 6 :(得分:5)
我认为你正在寻找更多的历史背景。原始zip是单个文件。 Tar用于将多个文件放入单个文件中。因此,tarring和zipping是两个步骤。为什么今天仍然如此占主导地位是任何人的猜测。
来自维基百科Tar_ (file_format)
在计算中,tar(源自磁带归档)既是文件格式(以存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由POSIX.1-1988和后来的POSIX.1-2001标准化。最初开发为原始格式,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,用于分发或存档,同时保留文件系统信息,如用户和组权限,日期和目录结构。
答案 7 :(得分:4)
在我看来,仍然今天使用tar
的原因是它是(可能很少见的)UNIX方法从一开始就完全正确的情况之一。 / p>
仔细研究创建档案所涉及的各个阶段,我希望你们同意这里分离不同任务的方式是 UNIX哲学:
一个工具(tar
在此处命名)专门用于转换任何选择的文件,目录和符号链接,包括所有相关元数据,如时间戳,所有者和权限到一个字节流。
只是另一个可任意互换的工具(gzip
bz2
xz
,仅举几个选项),将任意输入的字节流转换为另一个(希望)较小的输出流。
使用此类方法可为用户和开发人员带来一系列好处:
<强>扩展强>
允许将tar
与已经存在的任何压缩算法或任何压缩算法结合起来但尚未开发,而不必更改任何内容tar
的内部运作方式。
一旦全新的“hyper-zip-utra”或whater压缩工具问世,你就已经准备好用tar
的全部力量来拥抱你的新仆人。
<强>稳定性强>
自从80年代早期测试并在大量操作系统和机器上运行以来,tar
一直在大量使用。
每次新归档时,无需重新发明强制实施存储所有权,权限,时间戳等一遍又一遍工具不仅可以节省大量(否则不必要的)开发时间,而且还可以保证每个新应用程序具有相同的可靠性。
一致性用户界面始终保持不变。
没有必要记住要使用工具A恢复权限,你必须传递选项--i-hope-you-rember-this-one
并使用工具B,你必须使用工具C时使用--this-time-its-another-one
它是`--hope-you- didnt-尝试 - 用刀具作为开关。
如果你没有使用--if-you-had-used-tool-bs-switch-your-files-would-have-been-deleted-now
,那么在使用工具D的情况下你会真的搞砸了它。
答案 8 :(得分:3)
tar 主要因历史原因而受欢迎。有几种替代品可供选择。它们中的一些几乎和焦油一样长,但由于几个原因不能超过焦油。
tar的一个主要优点(和缺点)是既没有文件头,也没有内容的中心目录。因此,它多年来从未受到文件大小的限制(直到这十年,存档内文件的8 Gb限制成为问题,几年前才解决)。
似乎是tar.gz(或者ar.Z)的一个缺点,就是你必须解压缩整个存档以提取单个文件和列出存档内容,从来没有伤害过人们足以让他们从tar中瑕疵很多。
答案 9 :(得分:2)
gzip和bzip2只是一个压缩器,而不是一个归档软件。因此,组合。您需要使用tar软件捆绑所有文件。
ZIP本身,RAR也是这两个过程的组合。
答案 10 :(得分:2)
通常在* nux世界中,文件包作为tarball分发,然后可选择gzip。 Gzip是一个简单的文件压缩程序,它不执行tar或zip所做的文件捆绑。
曾经有一段时间,zip没有正确处理Unix tar和unix文件系统认为正常的一些事情,比如符号链接,混合大小写文件等等。我不知道是否改变了,但这就是我们使用的原因焦油。
答案 11 :(得分:1)
Tar =将文件分组到1个文件中
GZip =压缩文件
他们将过程分为2.就是这样。
在Windows环境中,您可能更习惯使用执行Zip的WinZip或WinRar。这些软件的Zip过程会对文件和压缩进行分组,但您根本看不到该过程。
答案 12 :(得分:1)
出于同样的原因,为什么mac用户喜欢磁盘映像:它们是一种非常方便的存档方式,然后传递,上传/下载或通过电子邮件发送等等。
比拉链恕我直言更容易使用,更便携。
答案 13 :(得分:1)
在我的Altos-XENIX时代(1982年),我们开始使用tar(磁带归档器)从5 1/4软盘或流式磁带中提取文件以及复制到这些媒体。它的功能非常类似于DOS 5.0和6.22中的BACKUP.EXE和RESTORE.EXE命令作为补充,允许您跨越多个媒体,如果它不能只适合一个。缺点是,如果多媒体中的一个有问题,整个事情就毫无价值。 tar和dd源自UNIX SYstem III,并且由于向后兼容性原因,它仍然是类UNIX操作系统的标准发布实用程序。
答案 14 :(得分:0)
Tar不仅是一种文件格式,而且是一种磁带格式。磁带逐位存储数据。每个存储实现都是自定义的Tar是一种方法,您可以通过该方法从磁盘上获取数据,并将其存储到磁带上,以便其他人可以在没有您自定义程序的情况下检索它。
后来,压缩程序来了,* nix仍然只有一种创建包含多个文件的文件的方法。
我认为这只是惯性,而这种惯性一直伴随着tar.gz的趋势。 Pkzip一下子开始使用压缩和归档,但DOS系统通常没有连接磁带驱动器!
来自维基百科的Tar_(file_format)
在计算中,tar(源自磁带归档)既是文件格式(以存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由POSIX.1-1988和后来的POSIX.1-2001标准化。最初开发为原始格式,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,用于分发或存档,同时保留文件系统信息,如用户和组权限,日期和目录结构。
答案 15 :(得分:0)
作为Windows开发人员, tarballs 看起来很奇怪是可以理解的。单词 $drycleaning = drycleaning::whereHas('carts',
function($query) use($cart_id) {
$query->where('carts.id', $cart_id);
})->get();
代表磁带存档。想想卷轴式录音机。
在Windows世界中,程序通常安装有tar
或setup.exe
,它们可以在注册表中使用各种魔法,创建目录并安装install.exe
(动态链接库)文件。
在Linux,Ubuntu中,特别是根据我自己的经验,包管理器负责处理应用程序并在大多数时间安装。在Ubuntu中,开发人员创建一个以.dll
结尾的包(Debian,Ubuntu所基于的)。安装.deb
的基本语法是:
.deb
虽然对于用户来说这是相对简单的,但开发人员要创建sudo apt install <package_name>
包并关联PPA是很多工作。
开发人员更简单的方法是创建tarball。然后最终用户共享安装负担。他们必须:
.deb
结尾)。.tar.gz
数据库(想想Windows安装的程序列表)可以备份。另一个答案已经说明了你提出的另一个问题,你可以创建一个tarball并同时压缩数据。不需要两遍过程。