作为一个主要的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文件更容易受到损坏,因为存档的一部分仍然可以访问.
奇怪的是,没有人提到现代版本的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
根据我的经验,它通常具有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
和的创造者没有预料到的行为gzip
.例如,你不仅可以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标准化.最初开发为原始格式,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,以进行分发或存档,同时保留文件系统信息(如用户和组)权限,日期和目录结构.