作为主要的Windows开发人员,也许我在Linux社区中缺少一些文化性的东西,但是它始终使我感到困惑。
下载文件时,首先将文件放入.tar
存档,然后将其压缩。为什么要分两步走?压缩无法实现文件分组吗?还有其他我不知道的好处吗?
作为主要的Windows开发人员,也许我在Linux社区中缺少一些文化性的东西,但是它始终使我感到困惑。
下载文件时,首先将文件放入.tar
存档,然后将其压缩。为什么要分两步走?压缩无法实现文件分组吗?还有其他我不知道的好处吗?
Answers:
bzip
并gzip
处理单个文件,而不是文件组。普通旧文件zip
(和pkzip
)对文件组进行操作,并具有内置存档的概念。
* nix哲学是可以很好地完成特定工作并且可以链接在一起的小型工具之一。这就是为什么这里有两个具有特定任务的工具,它们被设计为可以很好地结合在一起的原因。这也意味着你可以使用tar来组文件,然后你有一个压缩工具(的选择bzip
,gzip
等等)。
tar
归档文件的全部要点:Linux文件系统权限支持。如果您下载了Debian软件包,并由软件包管理器安装了该软件包,但是没有可执行文件是可执行文件,将会发生什么情况?这就是每个人都使用tarball 的真正原因...;)
一个重要的区别是这两种档案的性质。
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 ...
这将允许您指定任何替代压缩机。
[ 补充:如果要从中提取文件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
,后来compress
更受欢迎了(比pack
),然后gzip
与它的前任一起运行,并且与它完全竞争zip
(已移植到Unix,但不是本地的),而bzip2
以我的经验,现在通常比UNIX 具有10-20%的优势gzip
。
[ 补充:有人在回答中指出他们cpio
有有趣的约定。没错,但是当您不希望归档给定目录下的所有内容时,直到GNU tar
获得相关选项(' -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
工作方式)。或者,您可以将另一个程序(例如某些加密)放入管道中,并可以选择任意的打包,压缩和加密顺序。编写密码程序的人不必丝毫知道如何使用他的程序,他要做的就是从标准输入中读取并写入标准输出。
如此普遍的另一个原因是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用于将多个文件放到一个文件中。因此,去皮和拉皮是两个步骤。为何今天它仍然如此占主导地位?
从Wikipedia中获取Tar_(文件格式)
在计算中,tar(源自磁带存档)既是文件格式(以存档比特流的形式)又是用于处理此类文件的程序的名称。该格式由POSIX.1-1988和后来的POSIX.1-2001标准化。最初是作为原始格式开发的,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,以进行分发或归档,同时保留文件系统信息(例如用户和组)权限,日期和目录结构。
在我看来,今天仍然使用的原因tar
是这是UNIX方法从一开始就完全正确的(可能很少)情况之一。
仔细研究创建归档文件所涉及的各个阶段,希望您会同意,这里分离不同任务的方式在最大程度上是UNIX哲学:
一个工具(tar
给它这里的名字)专业转换任何文件,目录和符号链接,包括选择所有相关的元数据,如时间戳,所有者和权限为一个字节流。
还有另一个任意可互换的工具(gzip
bz2
xz
仅举几个例子),它将任何输入字节流转换成另一个(希望是)较小的输出流。
使用这种方法可以为用户和开发人员带来很多好处:
可扩展性
允许对夫妇tar
与任何现有的压缩算法或任何待开发,但仍压缩算法,而不不必在内部运作改变什么tar
都没有。
全新的“ hyper-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的主要优点(和缺点)是它既没有文件头,也没有内容的中央目录。因此,多年来,它从未遭受文件大小的限制(直到十年前,存档内部文件的8 Gb限制成为一个问题,几年前已解决)。
显然,tar.gz(或ar.Z)的一个缺点是,您必须解压缩整个档案以提取单个文件并列出档案内容,决不能伤害到足以使他们从tar中大量消失的人们。
通常在* nux世界中,成捆的文件以tarball的形式分发,然后有选择地压缩。Gzip是一个简单的文件压缩程序,它不会像tar或zip那样进行文件捆绑。
一次,zip无法正确处理Unix tar和unix文件系统认为正常的某些事情,例如符号链接,大小写混合的文件等。我不知道是否有所改变,但这就是我们使用tar的原因。
Tar =将文件分组为1个文件
GZip =压缩文件
他们将流程分为2个步骤。仅此而已。
在Windows环境中,您可能更习惯使用执行Zip的WinZip或WinRar。这些软件的Zip进程会将文件和zip分组,但是您根本看不到该进程。
Tar不仅是文件格式,还是磁带格式。磁带逐位存储数据。每个存储实现都是自定义的。Tar是一种方法,您可以从磁盘上取走数据,然后将其存储到磁带上,这样其他人就可以不用您的自定义程序来检索数据。
后来,压缩程序出现了,* nix仍然只有一种创建包含多个文件的单个文件的方法。
我相信tar.gz趋势只是继续存在的惯性。Pkzip一开始便同时进行了压缩和归档,但是随后DOS系统通常没有连接磁带机!
来自Wikipedia的Tar_(文件格式)
在计算中,tar(源自磁带存档)既是文件格式(以存档比特流的形式)又是用于处理此类文件的程序的名称。该格式由POSIX.1-1988和后来的POSIX.1-2001标准化。最初是作为原始格式开发的,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,以进行分发或归档,同时保留文件系统信息(例如用户和组)权限,日期和目录结构。
作为Windows开发人员,可以理解压缩包看起来多么奇怪。这个单词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并同时压缩数据。不需要两次通过过程。