$ V% d6 B, w9 F4 Q& C$ j
& W, }( n. L' u; S. s( Z, S; K% A. Q* d8 Z
前言
9 _' j) h$ I; x# J4 q/ k4 F" S. N( s% G
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
- [& {) x# G1 i: H$ Ztar
% L& o. L7 V0 k+ A3 k0 z
1 ]/ E0 w0 \( H4 F5 r+ Ntar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。' c+ x& j6 S2 ]( O
涉及参数说明:7 J: m' O$ x: t R! q3 X
-c 建立新的压缩文件- h/ F& N7 c# T: e
-r 添加文件到已经压缩的文件
# Y% p2 L( P+ w* ?) b-u 添加改变了和现有的文件到已经存在的压缩文件" g" r% s( H8 G4 W
-x 从压缩的文件中提取文件
; x5 R( u d/ j5 z-t 显示压缩文件的内容
7 @' l, [; ]- r6 d3 q' [-z 支持gzip解压文件6 R8 {- \2 | j5 M% s3 A
-j 支持bzip2解压文件
) {9 ^6 n8 L0 @( ]/ F" h! O-v 显示操作过程& m- e7 ^+ [$ s! g! D( e- N
-k 保留源有文件不覆盖
( D- p- T) ^0 U% f* `% D w-C 切换到指定目录
) \& n% o" o v B' Q0 l/ ^2 t-f 指定压缩文件! W; | i' N, ?0 k: k7 X7 T
+ h0 t; c5 a/ k' D/ K3 T
--delete 删除包中文件& H5 h+ ^8 H9 a8 _! z x
--strip-components 去除目录
9 p8 P# x; B7 h, N- U7 A W% H--add-file 向包中添加文件8 d" n0 ?) @0 M0 a
压缩
' V: @9 Z' {& ?# a8 U; m
, P& N6 v0 W9 _" i7 Z归档tar包,不压缩9 T- N$ u2 D) Z1 A
. R/ w8 o1 b% Z" \- ctar -cvf test.tar test1.log test2.log #归档多个文件& h5 q& W, ?* @: ?/ l
tar -cvf test.tar test/* #归档test目录下所有文件
5 m2 T& e, B2 T- h5 etar -cvf test.tar *.log #归档所有以.log结尾的文件 # c: f* u6 o# C a7 V6 H/ Y
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
: K$ S) E* K, L, [2 [$ P B归档并压缩为tar.gz或tar.bz2
/ v/ { h2 y j/ ^- k$ o3 L7 |) `( ~' c, M
这种方式打包对文件进行了压缩:2 P+ S h- E- K5 K: k/ ?. f) f n
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
1 ~; c, U6 [ \0 M0 X- Utar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩* \! o: h* S8 o1 D- R8 `4 I
查看压缩包中的文件6 Q1 H2 E. Y' g& u2 m+ O6 w( x% u
# L! Y9 f( h6 E( q8 @1 r( ], Z如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:9 K0 e; L! G+ {( ^
tar -tvf test.tar #可查看test包中有哪些文件
( x0 D. ]1 ] p0 Y9 R打包后删除源文件: N' l& u% L4 \, f* n2 l
7 i+ |% i% i3 S$ C4 ^% D8 G7 k
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
8 R8 N0 K5 j% ^# g6 T* { Utar -zcvf test.tar.gz test.log --remove-files / d5 F. i8 S( \: v5 g) q% Z
打包除指定目录或文件以外的文件) f6 s/ w0 h, e8 X2 l1 p) _
/ J' x/ W9 w5 ]7 E# R
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:7 q0 z$ n! J4 ?! a$ d7 V
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件0 w, g: v- H. T9 c
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
. N6 t0 v+ v) _( \' {' s L: F向压缩包中更新文件2 M: _* I- M- G) _7 V9 ?: U
# i+ ]( |! u+ _7 a _ u& M6 D+ ?
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:# M/ B" C1 k' |$ u
tar -tf test.tar --add-file=test #只针对tar包
/ C. ~+ @* Z$ x7 y$ {. J& w向tar包中增加文件$ J0 Z5 d! q+ K: D% ^$ M9 u
" r& q: o- I2 m' @; `" ~
向tar包中增加文件可使用-r参数:0 j2 G; M! ^0 ]4 P
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
( r `" K+ ^( c- B$ C) R删除压缩包中的文件2 x& {$ r2 f9 F4 }; D C
4 h b& e. f3 |9 _% |/ @
在不解压的情况下,可使用--delete选项删除包中的文件:
& [4 ]" @/ g/ I* H9 q2 }$ Atar --delete -f test.tar test1 #从test.tar中删除test1文件# r/ M! b# R( n7 [# h3 h
解压
$ J) Q7 }6 H3 b2 @* O% K
' q( S$ t, i- Y解压tar.gz和tar包到当前目录7 j8 l1 Z1 _* v4 |
, U- Y# [) \6 W
tar -xvf test.tar.gz8 p% a* A& Z- e" G- t a
tar -xvf test.tar
8 r/ L& p7 ^; D1 U4 I解压到指定目录
( }: {3 O3 V+ a% X
- Z: S! I: q( X8 ^2 `7 {+ mtar -xvf test.tar.gz -C dir! V0 {7 k% ^6 c# A- t
tar -xvf test.tar -C dir
! }2 }0 I2 s" n$ D7 D8 F解压包中指定的文件* t! ~9 v8 F K- z
# {* I5 T6 O9 i" P0 F: {5 M
例如test.tar.gz包中文件情况如下:
/ L8 B4 @; d3 @4 `0 f7 {1.txt
4 s* P. N3 H1 y2 W. M: M- n2 p2 _log/3 ^% \9 o' D0 z P* S9 A! ?0 L
log/1.log
& `9 x- l, H; _4 tlog/2.log0 Z% D+ a1 W! @# P/ E; m. I- s1 p' k. g
log/2.log
' q. ~$ ]) ]2 `+ Y* Hlog/4.log
# k) ?& r$ P7 g9 \+ q+ [log/5.log4 Q) ]) e2 [ \& ]
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:& k1 N4 J3 |/ _' O# r4 B
tar -xvf test.tar.gz log/1.log. o; v' k6 V: P/ e. A. b# ~& V
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
6 S' `* g. V: a7 t5 Y& G解压时去掉目录结构
( G7 P5 O/ U: l% H& r2 f7 v2 u
6 u, w: M- }, U2 H压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
$ Y6 d" c$ _' Btar -xvf test.tar.gz --strip-components=1 #去掉一层目录
" r! _# o$ o: ]. V解压时不覆盖原文件9 t. \7 _) S( h" n' G
" w% p! Q5 e. y. e4 Z3 Z/ Q当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
) Z2 _% [. T8 ^# ~tar -xvkf test.tar.gz6 u' O4 |( G! `
特别提醒
- ~9 \: N5 v' k
: v/ ]6 X' a- f. c: ]# J前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。1 `6 h4 q ~8 s
zip/unzip7 c0 g0 A4 W8 @2 x$ f
. ^4 ~* V* _; Z' N V( @6 ^zip和unzip命令主要用于处理zip包。
8 t1 l2 T3 p& r+ i* c; C压缩( j0 K+ i: T) i5 |3 f
( c. C* ~# O4 S/ R+ v" Q
涉及参数说明:
/ ?' s6 j' @, u% w8 N3 @-d 从压缩文件内删除指定的文件。* o( B5 X; m5 C4 r1 E0 o& q
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。$ e# L# L/ H# M. \# k2 o
-j 只保存文件名称及其内容,而不存放任何目录名称。
7 S h9 T' r: {/ X# N-r 递归处理,将指定目录下的所有文件和子目录一并处理。. L& I1 { K3 C. n! P8 _0 E. m4 i' k
-u 更换较新的文件到压缩文件内。9 ^! I, q% i0 F% |
-v 显示指令执行过程或显示版本信息。
) `) Q5 I1 s. v4 z- c% h2 D( y-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。' T" G Z+ N+ S3 W4 m
- <压缩效率> 压缩效率是一个介于1-9的数值。, \8 t2 j6 i6 y* j& E& J/ Y
压缩文件
' T5 d) l; Z8 e9 f8 g' |
/ Q/ ]0 J" i; W+ I) jzip -r test.zip test/ #打包test目录下的文件$ y+ k; z+ ]7 J
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录" v) ^9 U+ r* n4 ]0 R0 e& s; E/ P$ i
指定压缩率打包文件. {3 s! G6 c- n, C' ^# ]
7 C$ {& p& e( ^zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
- m, | N E* t8 W1 ?2 u打包符号链接文件% G. C, ?/ j. s! I
7 W9 o3 V+ J4 F5 |! }' K. i, k" s前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
% [' M3 Z% ]4 V3 C, W" V* h0 |zip -ry test.zip test; X3 M: A3 y' ]3 I! @
向压缩包中增加或更新文件; D3 X1 t' a3 v, X! O O
/ R; U4 B# u5 o2 k; B
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
& J, Q' k3 l$ g1 w, T: @1 K3 e/ Rzip -u test.zip test2 #向test.zip 包中增加test2文件
6 i3 H+ n7 R+ L4 z0 B压缩时加密
+ m( m. j( |, w+ t: |% @" q2 y8 E# j
压缩时如果需要对压缩包进行加密,可使用-P参数:% ~( a! A5 G8 L; R$ k& r; d
zip -r test.zip test1 test -P 66666 #使用密码66666加密) Y; q+ J. d- z" }9 W/ m) N/ R
删除压缩包的特定文件4 _/ n" W" F9 ]% w3 ^
$ S* q9 e0 }. A& N8 }zip -d test.zip test #删除test.zip包中的test文件, Y- o. l' Q2 {% h$ Z& k1 g- ]
解压' E+ S! I( J+ k# P" s# y2 V) M: i
! {' M$ F( D) h. o, ~! Y涉及参数说明:
( l3 F1 h* w0 i) G( h: |-l 显示压缩文件内所包含的文件3 ^, y, p/ ~. K5 h x" h
-j 只保存文件名称及其内容,而不存放任何目录名称。
8 B! V) m5 I7 c-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该5 Y- l1 f* h$ Z1 V# x0 R
-v 显示指令执行过程或显示版本信息。
7 ?& \: d+ R; f/ l2 g-d 指定解压目录,目录不存在会创建
4 c5 Y! C) a7 u* f$ n7 W查看压缩包中的文件信息
. y+ _4 p- J L3 M8 m! n" x1 X7 @ X7 m+ B; h
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息/ M% i6 p9 o, K% j, h; P
unzip -v test.zip #查看更多信息,例如crc校验信息等/ t/ A. X3 K1 ~; ^% ^
解压压缩包( _) Y/ O+ j' z6 w
+ j/ v V, ]) H _
unzip -o test.zip -d dir #讲test.zip解压到dir目录5 p) I2 I9 y. T" ?( }) z
解压包中指定的文件$ Z& t: G, O+ O4 {; l
& A# u+ x4 z# p3 G7 m A( o! X如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:0 _$ g8 d9 `5 @7 _6 L3 W
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录& A. u0 L0 P% t8 O) Z5 t, T* g
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件' d/ G# t* g* O$ A# ]
解压时去掉目录结构) @5 U; Q6 D8 u0 p, V6 z4 g0 x
. M7 y8 d# D9 H, _
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:6 ~! L0 H) ]( p6 L# E
zip -oj test.zip -d ./temp * _; R, ]5 d7 s3 @) H! f( e- G; a. i
解压jar包% E" n+ t! s+ y/ o
; [( U) y, Y2 E3 F2 f0 J1 g: G6 a
jar包是java归档包,但同样可用unzip解压查看里面的文件:
1 i8 H. I/ E, }. C9 Aunzip -o java.jar -d dir' {) n; J: ?* Z
gzip
; M* G/ w( v1 T, Z7 X$ P
, o; a1 W& {* z: D* \$ D1 u' u2 K涉及参数说明:+ a. A3 v5 h; R l4 _ [, @
-k 保留源文件2 ]5 F8 g8 Q/ l$ i% k. k8 ?2 C
-d 解开压缩文件
9 K: U% B/ m1 F% |8 a% W-r 递归处理,将指定目录下的所有文件及子目录一并处理
( q# \8 X4 v3 \2 d" O$ X-v 显示指令执行过程* v, I& t/ l/ {- J U! X- ~
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:: W2 j4 y4 I r- q; b% w2 t% ^, F
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包/ N7 b* f9 P. `; G0 H
gzip -rkv ./* 递归压缩
3 m' r9 y7 ~+ c. y* W解压也很简单:: b( U/ s0 f4 Q! [
gzip -dv test.gz + D) K. R1 ]. X0 L W+ ]
bzip2
. q: u" E& f+ C6 r
1 g% B' ]0 s: O# U: ?; J, Mtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
' M7 c% M4 S/ G3 [* ]8 z% ?bzip2 -zk test #压缩test文件
) ]& B9 n5 Z- j+ D' q9 ^bzip2 -dk test.bz2 #解压4 ^6 g4 N0 J+ u& t" w. b% V
rar/unrar
. D2 i0 n# |; \) N# ^( H: u5 x3 x, E! t+ Y2 H
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
" I+ h$ c$ c: ~. Vrar a test.tar test #将test文件压缩为test.tar
! m8 p) a* ~( s3 J0 srar e test.rar #解压test.tar
7 \# l- L1 ?) \( |2 f( tunrar x test.rar #解压test.tar' r$ C+ @2 Z f. J" Q) x0 ?, C
压缩率比较
6 @% K y* f! J4 \2 L5 F$ P8 {& ]* `1 O3 s |
压缩率一般来说:
, {9 B' F) Q, x. i" W* L( ^& `- otar.bz2>tar.gz>zip>tar
) u( Y" |* B4 J压缩率越高,压缩以及解压的时间也就越长。
* g* ~& O2 U$ C; @% Y总结
+ c; E" ^8 |; @+ T$ `) Z% q; x8 A) R& w% t8 w: j
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。' F0 @7 R- `. h% m" c+ X
有任何补充或建议,欢迎留言^_^。
' D3 r9 u9 ]" `6 }4 V! V5 E( }( ?/ y" Y5 c) a& p- P
' O3 P1 |/ D7 o$ }9 H
) C3 n+ b; Q7 Q5 S7 C' o5 `
( ^4 Z% [ V- ?0 V9 k7 \ b: W
|