/ C% q! P* t# R
5 ?4 Q+ d, ?' ?0 V% s& E8 H
0 h8 @1 a# }4 _/ C% |" G+ G5 q4 R前言
! F1 B5 }: w: @
& U7 i3 C. F! q/ T7 e$ [Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
# C; F4 S+ \) _1 x7 Utar
$ I, \2 h( ` \9 ~! o2 T: r
# R9 [0 M) W/ n( {tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。) q2 o" M8 M8 Q
涉及参数说明:
( {2 D2 V; R9 U$ a' v2 U6 H& E-c 建立新的压缩文件0 w8 B1 ^5 J. Q. |1 T% e% H
-r 添加文件到已经压缩的文件) J0 H$ }. u! D/ o
-u 添加改变了和现有的文件到已经存在的压缩文件
" D7 G; ~% ~$ `+ A8 J4 }$ H- a-x 从压缩的文件中提取文件
; j/ `4 k- r; c( m4 u-t 显示压缩文件的内容9 `# \& t1 Z7 x; z
-z 支持gzip解压文件+ v0 f {1 i- V/ j/ D
-j 支持bzip2解压文件8 j9 S8 m7 `% C: b4 v
-v 显示操作过程
+ R, i6 B; M8 b; x- z) S-k 保留源有文件不覆盖
; t0 g5 H* D x$ L-C 切换到指定目录9 O- c. ^* ^# s e
-f 指定压缩文件
0 D" C4 r% k2 B0 d+ ^/ q, C2 q: C/ J/ {6 T' F, w" `& }
--delete 删除包中文件. B4 X; ^9 s$ ?; O! A, s5 ?! _: t; s
--strip-components 去除目录
! ~* u/ W- x9 m6 S--add-file 向包中添加文件5 w: n) D2 `, I# M1 Y) y1 \
压缩# k) s. @# h" m9 q2 O
1 h1 U, F% g! w5 S/ M
归档tar包,不压缩& A/ v9 G' [9 S3 l3 y( ^* i7 ~2 q
( W p# Y% \, atar -cvf test.tar test1.log test2.log #归档多个文件4 K+ V. p. y0 L
tar -cvf test.tar test/* #归档test目录下所有文件
$ H. }1 P6 Q a* A% Ptar -cvf test.tar *.log #归档所有以.log结尾的文件
5 h, t: n+ r! V4 Z' Q* A1 T由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。, E+ r" Z5 X$ j8 h2 A! }, N
归档并压缩为tar.gz或tar.bz2
- F4 Q$ a) m! ?3 L4 h5 V. F& [* Y
这种方式打包对文件进行了压缩:
! \0 i, C2 T3 `2 s/ ztar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩6 X h& N& b* U8 O
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
! }+ r( q# _3 R0 X& O1 t; g查看压缩包中的文件! m+ |# d( u* p* q O1 s g
+ C% i$ ]( b2 i
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
/ _2 \: g6 t/ [; |( m1 F' Z+ ftar -tvf test.tar #可查看test包中有哪些文件& O. J1 D7 a0 V" p( r, R
打包后删除源文件
: ?# f) w. r$ i; U* z8 }/ i
) F' _+ J4 k" Y) S有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:, K" ?( V2 a4 s" y. Y, C1 J, v8 o
tar -zcvf test.tar.gz test.log --remove-files
0 q$ |% b2 `& m3 J打包除指定目录或文件以外的文件
2 K9 n5 e% D! E$ k
6 u# S1 r8 f. E# ^0 u4 }对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
8 k5 J" ?0 }8 g& W" S7 E- X" ytar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件' Q U4 r7 k, j( m
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。/ A7 F" e) O% L, V
向压缩包中更新文件
j: k& I; A' L. J- z: o% m
% ^1 f2 b! _" a* q7 c例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:$ h) P8 J }/ v
tar -tf test.tar --add-file=test #只针对tar包, V. c: I3 Z+ ~. f. p
向tar包中增加文件8 Y; I' n, M( x9 z* P2 Q
- w( F3 d* R- A ]9 f, ^5 w+ Y向tar包中增加文件可使用-r参数:
8 X$ A: Z! j* qtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
# C2 h4 K- L# t: ~6 `% v) T删除压缩包中的文件4 A ]$ H3 T! c( c9 R
9 I- x9 O) l, t! m
在不解压的情况下,可使用--delete选项删除包中的文件:) r4 `+ S% n4 P% c$ Z
tar --delete -f test.tar test1 #从test.tar中删除test1文件
! o$ i0 M7 o5 ?解压, [. c6 m- v- {% m) Y
/ N) P$ G! M+ |8 e7 _! W7 u+ A解压tar.gz和tar包到当前目录
& A6 l4 J' j; `% C* s
: v" ]: S9 C8 z( X( Q% K: `% rtar -xvf test.tar.gz
# ~: I. }" M9 U0 ^% }" a! itar -xvf test.tar
9 [7 z6 f6 I" L1 n. Q# J+ H( p解压到指定目录
4 n" }! }, }3 k5 z, e
0 Y8 l) J! }. w* }tar -xvf test.tar.gz -C dir* ?& Z: _; a& q# |+ p
tar -xvf test.tar -C dir" P# v* A9 U& T, ~2 q
解压包中指定的文件
* i! A, ^+ [$ {% D
) Q2 d% [4 A% u0 k6 h例如test.tar.gz包中文件情况如下:3 t1 D3 ^9 G% H
1.txt0 R! D% x5 j1 {% A5 A% q6 T
log/
X( v b7 F0 Z& Rlog/1.log
' r3 l: p I- f, t+ l: \- N$ ^, Nlog/2.log0 a D0 t L1 t* Q5 k- [
log/2.log- u0 O/ E j, b
log/4.log& _2 E' c! ]1 O# X- ]$ U5 C
log/5.log
1 d$ j( S& ~+ f( H如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:* X4 v9 J8 `1 L+ \( k
tar -xvf test.tar.gz log/1.log
! [( _# }' Z$ t0 M: k. vtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
9 j5 R* Z. N- a0 C2 q解压时去掉目录结构
4 }' e& x: S( X: U1 g' o7 e+ c
, w9 {7 N- Y8 K# B5 S' U压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
3 N, x/ ]+ a$ \/ Z2 ~( g( E: Gtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
- [2 L- b2 Q; ]5 E解压时不覆盖原文件) \, e j2 M8 s) F0 e2 B
; G. L% d3 [- ?2 I s2 b B4 z当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
2 U( g; Z9 P& @# H" t! m xtar -xvkf test.tar.gz
1 y# k. L# m) ~! l特别提醒
+ [6 J% O1 c" v* M/ a( r# o$ Y3 I/ c* Y' S( Y
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
0 ^! b& H0 y+ `5 P) kzip/unzip; f& T% w" J s6 _* g, s' l
$ S, E5 x, N/ f8 }7 P
zip和unzip命令主要用于处理zip包。
( r; K/ d; u ^- y/ ?& k) |压缩
+ D+ n3 J" s; o8 p3 v4 V, P- ^6 d: S5 Y$ @
涉及参数说明:1 W$ E) @) T" W7 o6 p
-d 从压缩文件内删除指定的文件。$ j8 j/ X x2 U0 X% ?0 @5 P' q
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。* r! D5 e2 N N2 m: Y
-j 只保存文件名称及其内容,而不存放任何目录名称。0 t4 E) e1 f+ N$ X
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
; n% f5 s9 B* I3 j. l, ^-u 更换较新的文件到压缩文件内。
8 d8 C' O+ s" \- ?# p2 }/ Q-v 显示指令执行过程或显示版本信息。
: c, c8 M, o* K2 c' P-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。( ?9 S$ y1 ^: P. U, C- f' Y6 \
- <压缩效率> 压缩效率是一个介于1-9的数值。
: k2 R+ V( C$ J, I% {) r压缩文件
& B3 A: L2 G% |7 C4 L/ w' J; q/ A+ \1 i8 e; g
zip -r test.zip test/ #打包test目录下的文件
: D' _2 V# s% U( J/ z( x: U8 Ezip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录; V3 ^) O/ p( ?
指定压缩率打包文件
/ T7 b- ~: [5 \+ O+ H2 @9 x5 J2 }8 F' e3 o
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长, g2 V: l' f8 j
打包符号链接文件
6 J0 K" `, F+ Y. H' L
$ m& [2 k9 V$ P) e6 X% p! p前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
4 M( r- I5 U) D4 c% Gzip -ry test.zip test
3 L, _: U/ A2 w W u向压缩包中增加或更新文件
* o2 T x& A5 S: ~, {( M# s N& ]. @
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
" t4 T0 V) Y1 v1 w% v- T5 i# G; h6 Jzip -u test.zip test2 #向test.zip 包中增加test2文件
$ d+ Y8 J/ i$ G4 l9 F2 V压缩时加密. S+ n: ?: j, P$ O: k& f6 w9 D4 ]
0 @5 c9 X% }* B7 Q4 n压缩时如果需要对压缩包进行加密,可使用-P参数:
) o* e3 S* I, U/ Hzip -r test.zip test1 test -P 66666 #使用密码66666加密1 H- d$ m8 J- `" a! e
删除压缩包的特定文件
c6 n/ A( R0 v1 W6 h" w
# ?( m5 x8 @; Q. Xzip -d test.zip test #删除test.zip包中的test文件
5 b D% T3 N8 ?9 D解压
% I6 C4 L" _! k) t) t8 H: _5 |& c8 M8 p+ G) U! g
涉及参数说明:/ Z4 N& ]6 c: v I) S+ S( m) U& T
-l 显示压缩文件内所包含的文件( @$ }( z8 {7 U) H; j7 X! T5 M9 ~" J
-j 只保存文件名称及其内容,而不存放任何目录名称。
" N3 r5 k4 I/ W: ~' X-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该) S8 v8 O7 u- Y9 l5 N9 T5 }
-v 显示指令执行过程或显示版本信息。+ P! O5 \5 a+ J e: O9 O- a# E9 h
-d 指定解压目录,目录不存在会创建' ? s9 q8 f2 c: `
查看压缩包中的文件信息0 h1 J4 h4 t, e
6 N/ \/ {6 m# b& ]2 B/ D! Aunzip -l test.zip #可以看到压缩包中的文件名,日期等信息0 j5 A9 u" ^- a6 J
unzip -v test.zip #查看更多信息,例如crc校验信息等5 Z/ p# P& K) f) S, L
解压压缩包# g4 x5 a6 n4 i/ `% K# Z: ~0 w
3 C& K0 o. {6 k% p4 x$ m; Runzip -o test.zip -d dir #讲test.zip解压到dir目录2 C6 ~& U+ d2 l# a$ \% t' t3 `" l
解压包中指定的文件" U0 b& @$ v/ j5 T2 U y( X/ `1 \
3 I# P8 q; q4 g* F. y# I
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:1 d$ {- K) z0 v2 ^! P, G
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录" ^. e a7 @$ v$ `) C) O3 x. c
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件* e& A- X! Q; F2 ?0 o( z- b
解压时去掉目录结构
% m9 }! i. T7 g* ^6 f! M0 t( y- \4 K2 n/ y8 o* p
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
+ r2 N1 Q% J) A7 ?/ ~2 ]* F' hzip -oj test.zip -d ./temp
, n. l1 x) @% c6 p解压jar包
( M6 i* R5 u. \ _, A
0 N6 e( W P N, {4 b1 Djar包是java归档包,但同样可用unzip解压查看里面的文件:
( Y+ H6 S+ q8 E& Cunzip -o java.jar -d dir9 {" ] ^8 I& y/ S3 k) K! X* H7 K
gzip
& i- ^7 v& s2 o: P8 D7 v' p: W8 [
$ a0 O' I: n u涉及参数说明:
( A/ D4 Q( s) F- t# n& v% [% y-k 保留源文件 a2 p, L, v) [2 Y0 q# u
-d 解开压缩文件
' x& J2 I2 H' i8 j5 a0 [, [8 E3 T-r 递归处理,将指定目录下的所有文件及子目录一并处理: e0 {7 X; h' L K" Z" w Q$ E
-v 显示指令执行过程
# Z1 }" D) Z3 \$ wtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
1 P6 o; v) S5 `8 Ggzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包$ N. s1 _9 }. l7 E- K: o" P1 l9 Z
gzip -rkv ./* 递归压缩! o9 K. g2 p& [" c
解压也很简单:9 M ~2 O& D. a \; b- h
gzip -dv test.gz
+ M U5 L; v9 i# abzip2
* ?5 Y) c, @. v; [8 u* c. ?$ b# V4 q. P* ?) @( U
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
$ R; l- h3 s- t% G& Rbzip2 -zk test #压缩test文件
, G# X" I2 k0 Y1 u6 ?: `4 nbzip2 -dk test.bz2 #解压
- J7 I$ b w/ k' _. K i6 crar/unrar
: b5 G# p O4 L6 }' B6 n# i6 R9 e0 B- F
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:1 d+ Y+ I2 U9 Q- c9 l$ E) J% U
rar a test.tar test #将test文件压缩为test.tar1 g2 \5 k W2 F5 V
rar e test.rar #解压test.tar- ?* w4 r% A+ n a- K# W
unrar x test.rar #解压test.tar) F0 H& S4 E6 W$ w' C
压缩率比较
& ]) t7 W' E/ c- }% U: v$ D3 Q* Y) I; z2 f; F( ~/ R3 i
压缩率一般来说:
! ]3 d. f3 }1 i9 s& @tar.bz2>tar.gz>zip>tar2 a' j" ^3 k) n
压缩率越高,压缩以及解压的时间也就越长。1 p& {6 o3 k6 E9 j5 ^) P$ g$ d }$ ~
总结
$ X ]8 _! r/ u# k, J* q
$ k) [5 I4 M, E7 f5 H5 v7 t) X- i对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
& S/ @; S3 c$ s9 T+ ~( E有任何补充或建议,欢迎留言^_^。1 Z: \' t8 u/ f7 n6 ~" o
5 _- T1 n8 g. a8 v7 o
0 ]4 O6 K! s6 E* a$ T
9 ^" N. d# g) }; m
; I$ w- T& |5 ?9 f6 V9 O5 p
|