使用zip命令行对文件打包压缩
2010-08-03 14:30:32 阿炯

ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7z格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。Microsoft从Windows ME操作系统开始内置对zip格式的支持,即使用户的电脑上没有安装解压缩软件,也能打开和制作zip格式的压缩文件,OS X和流行的Linux操作系统也对zip格式提供了类似的支持。因此如果在网络上传播和分发文件,zip格式往往是最常用的选择。


使用任何一种文本编辑器打开任何一个Zip文件,都能看到前两个字母为:PK。

ZIP是一种相当简单的分别压缩每个文件的存档格式。分别压缩文件允许不必读取另外的数据而检索独立的文件;理论上,这种格式允许对不同的文件使用不同的算法。不管用何种方法,对这种格式的一个告诫是对于包含很多小文件的时候,存档会明显的比压缩成一个独立的文件(在类Unix系统中一个经典的例子是普通的tar.gz存档是由一个使用gzip压缩的TAR存档组成)要大。

其规约指出文件可以不经压缩或者使用不同的压缩算法来存储。然而实际上ZIP几乎差不多总是在使用卡茨(Katz)的DEFLATE算法。支持基于对称加密系统的一个简单的密码,现在已知有严重的缺陷,存在已知明文攻击、字典攻击和暴力攻击。ZIP也支持分卷压缩。ZIP加入了包括新的压缩和加密方法的新特征,不过这些新特征并没有被许多工具所支持并且没有得到广泛应用。

压缩方法
用来对比压缩大小使用的是的内容和最大压缩比。

Shrinking(方法1)
收缩(Shrinking)是LZW的微小调整的一个异体,同样也受到LZW专利问题的影响。从来没有明确的是这项专利是否涵盖反收缩,不过一些开放源码的项目(例如Info-ZIP)决定谨慎行事,在默认的构造里不包含反收缩的支持。

Reducing(方法2-5)
缩小(Reducing)包括压缩重复字节序列的组合,然后应用一个基于概率的编码得到结果。

Imploding(方法6)
爆聚(Imploding)包括使用一个滑动窗口压缩重复字节序列,然后使用多重Shannon-Fano树压缩得到结果。

Tokenizing(方法7)
令牌化(Tokenizing)的方法数是保留的。PKWARE规约没有为其定义一个算法。

Deflate和增强的Deflate(方法8和9)(使用pkzip for Windows,版本8.00.0038测试,下同)
这些方法使用众所周知的Deflate算法。Deflate允许最大32K的窗口。增强的Deflate允许最大64K的窗口。增强版完成任务稍稍成功一些,但是并没有被广泛的支持。Deflate比较尺寸是52.1MiB,增强的Deflate比较尺寸是52.8MiB。

PKWARE Data Compression Library Imploding(方法10)
PKWARE数据压缩库爆聚(PKWARE Data Compression Library Imploding),官方ZIP格式规约就此没有给出更多的信息。比较尺寸是61.6MiB。

方法11
此方法被PKWARE保留。

Bzip2(方法12)
此方法使用众所周知的bzip2算法。此算法比deflate高效但是并没有被(基于Windows平台的)工具所支持。比较尺寸是50.6MiB。


大家都知道winzip对文件解压和压缩都易如反掌,但是如何通过程序和命令行对其调用呢?当然winzip的作者已经开发出WinZip Command Line Support Add-On Version 1.0,大家可以去下载wzcline.exe。前提是本机须安装winzip8.0或更高版本的支持,如果不是winzip8.0,可去下载页面下载后,直接安装就可以。就会在winzip的目录中产生winzip命令行帮助文件和程序wzzip.exe,wzunzip.exe。

可以开始运行里调用:
如:"c:\program files\winzip\wzzip" myfile.zip

也可以拷贝这里两个文件到任意目录下,直接在dos窗口下运行
如:wzzip.exe  myfile.zip

可以在系统的环境变量里加入set path=c:\windows;c:\program files\winzip;

就可以在任何地方不用加入路经调用了。

现在来简单的了解一下帮助中两个命令的基本用法
压缩文件用 WZZIP.exe :
通用格式:wzzip [options] zipfile [@listfile] [files...]
[options]包括:
-a 默认的操作,压缩文件
-a+ 压缩文件,并删除要压缩的文件
-b[drive|path] 是在另外的驱动器上创建临时压缩文件
-d 删除zip文件中指定的目标文件
-e 是设置压缩比率,x最大,0最小
-f 替换zip文件中存在的文件
-h|-? 察看帮助
-v 创建一个压缩文件的列表信息
-@list 先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名压缩
[@listfile] 是压缩文件的列表信息纪录
[files...] 则是要压缩的多个文件,用空格隔开,也可以用通配符

例如:
压缩当前目录的所有文件  
wzzip test.zip *.*

压缩类型为txt的所有文件
wzzip test.zip *.txt

压缩两个文件           
wzzip test.zip abc.txt def.txt

压缩类型为txt的所有文件除了abc.txt
wzzip -xABC.TXT test.zip *.txt

压缩D:\docs下的所有类型为txt的文件及子目录
wzzip -rp test.zip d:\docs\*.txt

把zipit.1st里的文件更新到test.zip
wzzip -u test.zip @Zipit.lst

列出一个压缩文件的列表内容
wzzip -v test.zip

解压文件用WZUNZIP.exe:
通过格式:wzunzip [options] zipfile [@listfile] [path] [files...]
[options]包括:
-c[m] 解压是显示文件列表在dos屏幕中
-d 重建zip文件中的目录结构
-f 只解压在zip文件里同目前文件夹存在的同名的文件,如果没有则不解压
-jhrs 忽视zip文件里的文件的隐藏、只读、系统属性
-Jhrs 只解压带有隐藏、只读、系统属性的文件
-n 只解压叫新的文件,如果要解压的文件比已存在的新则替换。
-o 不用通过yes来确定是否要替换文件
-v 创建一个压缩文件的列表信息
-@list 先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名解压

示例:
创建所有文件到当前目录下
wzunzip test.zip

从test.zip中创建abc.txt到当前目录下
wzunzip test.zip abc.txt

创建在test.zip中的目录结构及文件到当前目录下
wzunzip -d test.zip

创建在test.zip中的目录结构及文件到c:\docs下
wzunzip -d test.zip c:\docs

从test.zip中创建包含在files.ist中的文件名的文件
wzunzip test.zip @files.lst

显示test.zip的文件列表内容
wzunzip -v test.zip

显示压缩文件中所有类型为txt的文件列表内容
wzunzip -v test.zip *.txt

说完了在windows平台,我们再来看看在linux平台上的使用方法,Linux中zip压缩和unzip解压缩命令详解。

1、把/home目录下面的mydata目录压缩为mydata.zip
zip -r mydata.zip mydata #压缩mydata目录
2、把/home目录下面的mydata.zip解压到mydatabak目录里面
unzip mydata.zip -d mydatabak
3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip
zip -r abc123.zip abc 123.txt
4、把/home目录下面的freeoa.zip直接解压到/home目录里面
unzip freeoa.zip
5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面
unzip abc\*.zip
6、查看把/home目录下面的freeoa.zip里面的内容
unzip -v freeoa.zip
7、验证/home目录下面的freeoa.zip是否完整
unzip -t freeoa.zip
8、把/home目录下面freeoa.zip里面的所有文件解压到第一级目录
unzip -j freeoa.zip

主要参数

-c:将解压缩的结果
-l:显示压缩文件内所包含的文件
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换
-t:检查压缩文件是否正确
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其它文件解压缩到目录中
-v:执行是时显示详细的信息
-z:仅显示压缩文件的备注文字
-a:对文本文件进行必要的字符转换
-b:不要对文本文件进行字符转换
-C:压缩文件中的文件名称区分大小写
-j:不处理压缩文件中原有的目录路径
-L:将压缩文件中的全部文件名改为小写
-M:将输出结果送到more程序处理
-n:解压缩时不要覆盖原有的文件
-o:不必先询问用户,unzip执行后覆盖原有文件
-P:使用zip的密码选项
-q:执行时不显示任何信息
-s:将文件名中的空白字符转换为底线字符
-V:保留VMS的文件版本信息
-X:解压缩时同时回存文件原来的UID/GID

Linux中的zip与unzip

zip命令详解

zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有'.zip'扩展名的压缩文件。

语法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件…][-i <范本样式>][-x <范本样式>]

参数:
-A 调整可执行的自动解压缩文件。
-b<工作目录> 指定暂时存放文件的目录。
-c 替每个被压缩的文件加上注释。
-d 从压缩文件内删除指定的文件。
-D 压缩文件内不建立目录名称。
-f 此参数的效果和指定”-u”参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
-F 尝试修复已损坏的压缩文件。
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-h 在线帮助。
-i<范本样式> 只压缩符合条件的文件。
-j 只保存文件名称及其内容,而不存放任何目录名称。
-J 删除压缩文件前面不必要的数据。
-k 使用MS-DOS兼容格式的文件名称。
-l 压缩文件时,把LF字符置换成LF+CR字符。
-ll 压缩文件时,把LF+CR字符置换成LF字符。
-L 显示版权信息。
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-n<字尾字符串> 不压缩具有特定字尾字符串的文件。
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-q 不显示指令执行过程。
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
-S 包含系统和隐藏文件。
-t<日期时间> 把压缩文件的日期设成指定的日期。
-T 检查备份文件内的每个文件是否正确无误。
-u 更换较新的文件到压缩文件内。
-v 显示指令执行过程或显示版本信息。
-V 保存VMS操作系统的文件属性。
-w 在文件名称里假如版本编号,本参数仅在VMS操作系统下有效。
-x<范本样式> 压缩时排除符合条件的文件。
-X 不保存额外的文件属性。
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
-z 替压缩文件加上注释。
-$ 保存第一个被压缩文件所在磁盘的卷册名称。
-<压缩效率> 压缩效率是一个介于1-9的数值。

unzip命令详解

unzip为.zip压缩文件的解压缩程序。

语法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]

参数:
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行是时显示详细的信息。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P<密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-V 保留VMS的文件版本信息。
-X 解压缩时同时回存文件原来的UID/GID。
[.zip文件] 指定.zip压缩文件。
[文件] 指定要处理.zip压缩文件中的哪些文件。
-d<目录> 指定文件解压缩后所要存储的目录。
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令

这么多参数在实际过程中并没有那么麻烦,以下样列:
zip -r freeoa.zip abc.txt dir1 #把一个文件txt和一个目录dir1压缩成为zip
unzip yasuo.zip #解压文件到当前目录
unzip abc\?.zip #同时解压当前目录下的文件zip,zip和abc3.zip?表示一个字符,如果用*表示任意多个字符
unzip -v large.zip #仅查看压缩文件zip中的内容,不解压
unzip -t large.zip #验证压缩文件zip的完整性
unzip -j music.zip #把压缩包zip中的文件全部解压到第一级目录,而不要创建与原目录结构一样的多层目录


ZIP轶事

只要在这几十年间从zip格式的压缩文件中获得了便利,就应该感恩这个名为菲利普·卡兹的程序员。一切都起源于上世纪八十年代互联网还只是个雏形的时候(真正意义上的互联网是1991年出现的),当时电脑的主流操作系统还是需要手动敲代码的DOS系统。

那时传输数据的方式也相当原始,主要媒介还是那些容量只有1.44MB的3.5英寸软盘,而为了在有限的容量内塞进更多文件,也为了适应当时计算机之间每秒0.1KB到1KB的龟速传输速度,文件压缩技术应运而生,当时市面上比较主流的商用压缩软件还是ARC,我们的主角菲利普还也只是一个大学毕业不久的愣头青程序员。在当时的BBS里,除了文字以外,但凡是稍微大点的文件和图片就要用ARC压缩之后才能正常传输,而喜欢水贴的菲利普又买不起正版,于是他选择用汇编语言复写了ARC的代码,并命名为PKARC对其他人免费发放。

实际上,菲利普的行为对于当时的程序员来说并不算太出格,对其他软件的源代码进行复写或者修改对于那些人人都会写两行代码的初代网民来说并不是什么新鲜事,如果只是小范围内使用,原作者往往也会睁一只眼闭一只眼。但菲利普复写的盗版软件不仅在BBS上免费传播,并且运行速度也比正版更快,直接把ARC的正版用户背刺成了冤大头,自然引来了ARC开发商的不满。

后来的一些文章喜欢把菲利普塑造成敢于向大公司挑战的小人物,但当时ARC的开发商其实也不过是个3个人白手起家的小公司,并且也没有站在道德高地上甩给菲利普一封律师函,而是联系菲利普希望能收购他的PKARC,在交涉失败后才选择了对簿公堂。二者谈崩的根源在于菲利普不愿将PKARC商业化,而这也得到了当时众多BBS网友的支持,那时舆情的力量就可见一斑,网友们因为菲利普被起诉发起了声势浩大的声援活动,甚至有人为此删除了自己买的正版ARC。“SEA(ARC开发商)要起诉菲利普简直不可理喻,我已经愤怒地卸载了ARC并给菲利普寄了一张远超建议价格的支票来支持他”

不过美好的理想和网友的支持并不能改变他侵权的事实,作为理亏的一方,菲利普选择在支付了一大笔赔偿金之后停止后续版本的开发,这场上古时期的互联网节奏以一个不那么让人满意的结局草草收场。这起诉讼风波过后,菲利普反而坚定了自己的信念,仅仅几周过后,他就完全重写了一个自己的压缩软件,在压缩速度和压缩比上全面领先ARC,这个压缩软件被他命名为PKZIP,它使用的压缩文件格式就是我们如今熟悉的.zip。1989年,PKZIP正式上市,菲利普宣布每个人都可以无偿使用这个软件和它的编码算法而不需要缴纳任何的专利费用。当然与后来的WinRAR类似,如果你用地开心,也可以给菲利普的公司寄上25美元。这一次,终于没有人能阻挠他给网友提供免费的压缩软件了。

事实证明,即便菲利普将PKZIP免费化的时候可能没想太多,但这却赋予PKZIP极强的生命力,不仅没多久就把曾经起诉菲利普的ARC开发商干倒闭了,甚至在无意之间下了一手“大棋”。

如今来看,Windows系统的推出对于计算机行业的颠覆是毋庸置疑的,它极大降低了计算机的使用门槛,使那些完全不会写代码的人成为了后来的主要用户。不过在划时代的Windows 95推出之前,用惯了DOS系统的老派程序员却看不上使用图形化界面的早期Windows系统,很少有人为它编写软件,压缩工具这一领域更是几乎空白。之所以说“几乎”,是因为早在1991年Windows 3.0发布后不久,WinZip,也就是Windows系统版的PKZIP就在一位不知名程序员的手下诞生了,而当时无论是菲利普的公司还是他本人都并不看好这个系统。

虽然当时来看这个软件做得并不怎么上心,只是个套了一层Windows壳的压缩工具,仍然是在调用DOS版的PKZIP而已,甚至当时之所以选用PKZIP也很可能是因为用它的代码不需要花钱罢了。但等到Win95面世,大量新用户涌入进来之后,大家才发现WinZip不仅在很长一段时间内没有任何竞争者,并且已经为用户迭代出了一套几近完美的图形化界面,轻轻松松就独吞了整个Windows市场。

1985年一家名为SEA(System Enhancement Associates,系统增强伙伴)的小公司开发了一个在MS-DOS平台下的商业压缩软件,名为ARC。当时的软件发行方式与现在略有不同,用户购买了软件,除了得到软件的可执行文件还包括一份C语言的源代码。当时的卡茨与很多用计算机的平民一样,缺乏资金购买大量的商业软件,当时卡茨从网上下载了一份ARC的C语言源代码,并用汇编语言将其全新编写并编译出来。卡茨将这个软件名为:PKARC(Phillip Katz' ARC)。卡茨制作的新软件PKARC因为是参照源代码编写的,所以完全兼容ARC并且性能上比ARC高。卡茨当时将这个新软件上传到网络上面。显然,卡茨此举造成对SEA公司的侵权。SEA最初希望通过联络卡茨使PKARC成为SEA公司旗下的一款产品,后来卡茨拒绝了。最终,双方对簿公堂,结果是卡茨败诉,卡茨被判以对SEA公司的赔款以及停止发放PKARC。后来,卡茨在研发过程中的PKARC续作也被迫重新改写所有代码,PKARC其实就是下文提及的PKZIP的前身,但卡茨没有从PKARC赚到一分钱,还是穷困潦倒,又因为酗酒等众多原因,2000年死在一个汽车旅馆中。 这场官司过后几周,卡茨就制作出新压缩软件PKZIP(Phillip Katz' ZIP),这款全新的软体比ARC的压缩率、压缩性能都要高许多,并且包含更多功能。此后,卡茨还将ZIP的所有技术参数公诸于众。ZIP(含义“速度”)这一名称是由卡茨的朋友罗伯特·马宏利(Robert Mahoney)建议的。他们想暗示,他们的产品比ARC在一定时间内更快速。这个名字往往被写成大写字母,因为在DOS系统内,通常都是使用大写字母作为后缀名的。

Windows 3.0面世之前,有两种格式与ZIP同样流行,一个是LHA(LHArc),另一个是ARJ(Archiver Robert Jung),直至到1995年,这3种压缩格式都是PC应用的主流。1995年微软发布了Windows 95,当时从DOS转移到Windows的用户们,极度渴求对图形界面下的优良软件,Winzip以其优良的性能以及不太晦涩的图形用户界面吸引了用户的目光,在当时占有大量的市场占有量;当时的WinZip仅仅是一个调用DOS资源的GUI外壳,但是其从Windows 3就开始的制作经验使其GUI性能和外观都比当时的流行软件要好。很快的WinZip就成为了当时一个很流行的软件,同时也带动了ZIP的传播,由于在前期太受欢迎,使到后期很多用户都以为,是WinZip创造了ZIP,其实这是一个误解。

基本上,Zip文件的发展都是由PKware公司与Winzip所推动。然而其两家公司就某些问题上互相猜疑,导致发展缓慢。人们目前最想在Zip文件实现的目标,就是加强目前Zip文件的加密能力。就目前而言,Zip的文件加密能力弱得可怜,仅凭单单一个口令保护,根本满足不了安全需求。虽然卡茨在世时公开了格式,留有为日后升级的空间,但Winzip仅仅是一个用户,根本无法发布新标准,其标准的制订权依然保留在PKware手中。2002年时,PKware开发了支持256位AES加密的PKZIP 5.0,但是Winzip在2003年发布的Winzip 9却被证明了无法与之兼容;双方都互相指责对方违背了Zip的自由开放精神。这是Zip自诞生日起,第一个对于它来说最严峻的挑战。由于出现于市场的时间早,现在Zip文件与其他压缩格式相比有众多无法忽视的缺点。原生并不支持Unicode文件名称,容易导致一部分的资源共享困难,在东亚文化圈的资源交流尤其显著;无法与7z相比的压缩比率以及如WinRAR的Recovery Record修复支持功能的缺乏亦都是其衰微的原因。针对上述缺点,前WinZip团队有开发后继者ZIPX格式,但仍不普及。