+ a2 v X0 T' U, \* s& `( {) ], z- m$ { n/ Q
6 k1 c1 j& y6 h, [1 i! c前言4 O' @/ H- B. t0 e* u8 G
, K9 w0 Z; t6 S. y8 Z, H3 O4 iLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。' e# {3 @' u5 F7 @5 X# M
tar* M9 r: r% N3 V' f# Z: n# \
) e, a2 @% }+ Mtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。5 }4 B5 \+ t' X- p% q: z
涉及参数说明:& s% }8 y1 J; C8 n1 j( q( e0 A
-c 建立新的压缩文件, V* W8 V" C. N5 t) ~! x/ N7 O
-r 添加文件到已经压缩的文件
4 a1 r8 F8 R' \1 {-u 添加改变了和现有的文件到已经存在的压缩文件: ]) y) `+ a9 ?4 q! D
-x 从压缩的文件中提取文件
& j% e1 v) Q; V% R, o-t 显示压缩文件的内容
5 f( |( ^+ m+ w, {9 _* a. c }-z 支持gzip解压文件
2 ?; B6 r. d$ y-j 支持bzip2解压文件. Z! G; y) Q2 E+ Z4 h
-v 显示操作过程
" u! u7 }' w9 U6 W8 V! z-k 保留源有文件不覆盖' R. R' g& b3 c/ B, y, D' S- Y' K
-C 切换到指定目录
" P* B1 u4 l- [7 r: H9 Z3 d+ t-f 指定压缩文件& `4 C* s2 Z0 ~- _4 h: v% ~1 f
5 Y* j. `$ {+ H% `
--delete 删除包中文件. F+ X) n3 ]8 Y+ l0 l) |( c* a
--strip-components 去除目录1 w/ G! b+ B+ K+ o6 K6 }0 }
--add-file 向包中添加文件
Y# Y# q: l* E( L, z/ H) d压缩
2 X, \6 U d7 O/ Z+ O+ ^0 O* H/ p3 i% h0 n: `: Q D; R
归档tar包,不压缩8 G3 ~. |6 ~2 k ~3 k/ |
8 T. r! J: Z3 C5 @
tar -cvf test.tar test1.log test2.log #归档多个文件
; l- H/ E& ?9 x! C1 _1 |3 _ w: otar -cvf test.tar test/* #归档test目录下所有文件8 J& v3 e/ Q8 ?5 }* h; \
tar -cvf test.tar *.log #归档所有以.log结尾的文件
3 E# w' I: _6 e2 }由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
. }% B" {3 t, R归档并压缩为tar.gz或tar.bz2 W6 f/ t: D6 j3 y, k0 Q3 y
" O% F+ @9 B& J8 b/ f3 A W这种方式打包对文件进行了压缩:
% f& A1 l3 m. \9 q3 {! A: M* i) _tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
/ ~9 ?: X0 e7 `4 Z& o% @tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
: k' y! M+ c3 D, ~# h! I查看压缩包中的文件
% y( q0 T) W5 u2 ^- N# l- l# o5 e# n7 p. q# G: W
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:! T- @* [1 V! x2 | ?
tar -tvf test.tar #可查看test包中有哪些文件
- G0 b x! i `& C, e4 u. {5 R" p打包后删除源文件# X4 F3 \! `1 G' a. j
) V% |* z4 b9 ]! n
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
& t' X$ v% I- y* e9 U4 Etar -zcvf test.tar.gz test.log --remove-files / X+ }0 f; i: n# S6 L
打包除指定目录或文件以外的文件$ ^* s# c: n3 o
- B6 A/ L! B! t3 q* e- J
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:- ]1 s: n& q, x
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
: N' W e; p6 M0 e- Z# ^这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
/ \! a6 v- I8 l N2 P向压缩包中更新文件
$ t( _% p6 l8 y E$ V2 v7 E5 i, {* J0 ]
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:: j; V0 [ J4 M, o8 U
tar -tf test.tar --add-file=test #只针对tar包0 K8 q v6 m# {1 D' P! Y
向tar包中增加文件! P. d; a Q& D( P% I
. V1 W1 P2 O4 n7 ?) M向tar包中增加文件可使用-r参数:
( w& W* g; f+ @3 {9 Z( V- y3 }tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
3 h1 d( t( m5 X$ ^ W* {; }& a删除压缩包中的文件2 c, W& [1 U: O& ?
( H1 N X8 C* o& \. |
在不解压的情况下,可使用--delete选项删除包中的文件:7 Y9 S9 X) ^. c% S; {
tar --delete -f test.tar test1 #从test.tar中删除test1文件
' o- O, S. Z% B2 h解压
& {( N: p' U7 `# X% s+ K8 }6 b4 ?/ M! [7 I9 t/ r
解压tar.gz和tar包到当前目录" W: m1 b% t3 w4 S
6 ?- B. _' f% d) T; O9 f* wtar -xvf test.tar.gz
! j: o3 z8 j7 M1 z. U( G% l, ptar -xvf test.tar ( X; n! E5 e- Z4 L7 _! I: x
解压到指定目录
/ T7 k2 w$ e: \" o+ ^
) c6 b) ]7 [8 i+ f% n$ x c- c" k4 B4 itar -xvf test.tar.gz -C dir
, c; ?% K: m3 }- Ztar -xvf test.tar -C dir2 ] H+ O r( F/ `
解压包中指定的文件
8 p% v# D, Y) J% C q
/ M2 p, Z- B& e6 I, n6 y. L3 s- D1 o例如test.tar.gz包中文件情况如下:9 l3 @2 F/ z2 U8 Z" y% O
1.txt
' G+ B$ g% N& [) Rlog/$ q. q7 _ T5 o, H" S4 ~! F
log/1.log
f& ^) m0 J- q! J3 M4 H! X6 n/ Xlog/2.log: R6 V* F( a' `9 D
log/2.log
" g( {! G4 v) h8 i$ U; qlog/4.log
- U( {9 \' q) O. ylog/5.log
7 [, z% Z% p9 ~, K1 _如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:6 q6 Y+ I& ~! I& \6 j4 B
tar -xvf test.tar.gz log/1.log* A! |8 \' e; Z" v- z& u+ p- ~' P) F
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
8 b) M" t$ I* W( H# v& g1 [解压时去掉目录结构
$ P4 |; n' A' F X1 D# {$ Y% a- g; u7 o$ N2 n/ ]; s) z" {7 V
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
+ h( h8 n+ Q6 {- O' t7 Ttar -xvf test.tar.gz --strip-components=1 #去掉一层目录 n& w5 {7 i* V. R/ N D. ^
解压时不覆盖原文件/ T1 s) d \" t c; B2 L! H3 S, J
. R+ T5 E6 X0 n# V$ w3 ~4 X" U. j9 Z当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):: y0 R/ W) V5 ]" b: G7 ?( I
tar -xvkf test.tar.gz0 ~8 \! G; _+ W+ }' K x
特别提醒
5 c B9 z$ [' O! s5 M0 p0 u8 b/ P% G0 b
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。3 Q& y$ B+ z& ^
zip/unzip
% {. m. S( Q" ~0 L8 P% C
4 I/ F3 v: S& l, h/ Z& rzip和unzip命令主要用于处理zip包。
& d' N$ q/ N8 `. D压缩
( Q1 A; j$ V' t7 j7 O# L# J! v8 q) @5 l$ h+ e- F
涉及参数说明:
; t* m, t; g4 e% c-d 从压缩文件内删除指定的文件。
; C) j- @1 q2 M! F' ~-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
& S! v! w: h9 R1 c* E/ t8 M; p-j 只保存文件名称及其内容,而不存放任何目录名称。
" Q1 Q8 i: M; i-r 递归处理,将指定目录下的所有文件和子目录一并处理。
% L' t' u/ ^( ]2 E-u 更换较新的文件到压缩文件内。, w9 B) Z( t) q* h3 V) c
-v 显示指令执行过程或显示版本信息。3 Y" |- L9 A2 P1 D% g! _% t
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
. Q+ E& g0 G1 [ A& Y- <压缩效率> 压缩效率是一个介于1-9的数值。
5 J L k S# H' t7 F- Y+ H- `压缩文件! ]0 [1 B! s1 l+ }1 Z. X
) N# {4 [- T8 M; czip -r test.zip test/ #打包test目录下的文件+ y% L8 {4 n' R+ X p5 @# e7 d
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
$ q i( W# L5 B3 g指定压缩率打包文件
t, a' B% c9 k1 w+ e
8 O% o4 r. p) c( Q+ Rzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长+ C7 P( P) W2 u' h* [
打包符号链接文件
, e- w$ l0 Y* \# ?$ Z9 O9 I8 S8 B; I6 L+ O2 B9 r
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
: E7 u( t0 @" N/ b' dzip -ry test.zip test: r* M. G4 c9 J$ |' N. J
向压缩包中增加或更新文件 w; A a" S7 j/ i H
3 x0 O+ u) I5 S6 s3 W/ A$ z8 T
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:* @7 y( }, C! ~8 m5 S3 K% u
zip -u test.zip test2 #向test.zip 包中增加test2文件
! R K) ^! }$ _! ?8 N5 y3 B压缩时加密- |! Z0 |7 S- H; x- X! q
9 a3 x$ } h& J& y
压缩时如果需要对压缩包进行加密,可使用-P参数:
: ^2 I- [: ~- l: H& r @; fzip -r test.zip test1 test -P 66666 #使用密码66666加密) V4 ] m/ a0 z( r+ z
删除压缩包的特定文件
$ r6 ?& |1 w* ]
\$ m$ Y/ u2 n+ f0 J! a7 azip -d test.zip test #删除test.zip包中的test文件" H5 N* I/ Z/ g9 D
解压
( ]4 W% a# P, W. @4 ?( n8 d; N- O1 z3 V; z. Y j
涉及参数说明:1 a/ d$ G5 X! L
-l 显示压缩文件内所包含的文件1 D4 W1 l7 R) C5 F: k, R
-j 只保存文件名称及其内容,而不存放任何目录名称。
; e; r. }* x- G9 U% Z-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
/ X, `6 ^2 @- H, o5 p5 X8 k-v 显示指令执行过程或显示版本信息。1 n2 Y, u( ]2 S6 d3 a) s
-d 指定解压目录,目录不存在会创建% o6 Y! k/ ^* O8 [9 B# ]3 }
查看压缩包中的文件信息
* u" L6 c) c5 R6 s( I% K, z, ?: d8 k- P# O( p+ h
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
' y+ E! d/ W& J" y: K7 u4 x3 wunzip -v test.zip #查看更多信息,例如crc校验信息等: D3 o% k& S; J+ ~3 i x4 s$ D1 }0 j
解压压缩包& D+ D3 J1 L- Q2 q0 ~. E4 p
# a0 {6 h2 D' R( ~, x3 {unzip -o test.zip -d dir #讲test.zip解压到dir目录
$ g" w6 T1 K a1 H解压包中指定的文件, h& C+ B1 h* Y% F
% M3 a4 `3 p$ H( J如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:/ Y9 E( w& {! Q( G0 U+ i
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
1 G, o2 _9 F) o: m& _unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件
: B. G& t ]: {$ d8 l6 `4 u解压时去掉目录结构, V8 X' a2 V! b, ]6 _& G8 G8 }
4 S) Z7 T6 A; K+ f
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:5 ?2 A% T5 l7 o9 c
zip -oj test.zip -d ./temp ) b, Z/ l# T) ^5 E4 Z) u
解压jar包# U4 e7 `! @5 C1 u* T
: ~; m* X& h# s" P, `' @+ o0 vjar包是java归档包,但同样可用unzip解压查看里面的文件:7 ~" b# @5 m) K0 D1 |: E1 x
unzip -o java.jar -d dir8 ~5 ~% f' A3 g) S' W
gzip
" Q W6 V% N0 Y' ~4 \
( X r' {/ Z" Z2 I" t7 o5 u! R! M; z涉及参数说明:
& J! R. ~9 y9 d" Z-k 保留源文件
0 G4 [6 @" _; j/ T-d 解开压缩文件( F* Q/ Y w7 `% M6 G
-r 递归处理,将指定目录下的所有文件及子目录一并处理
' D- G. j& G4 n3 p# ~; y-v 显示指令执行过程
+ s& M( r# h7 t- K2 T& z5 {tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:6 ^2 l9 V+ ^0 [1 r7 C9 F2 L! d; Q5 J: P1 B
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包3 Y: V! {/ [* X) e
gzip -rkv ./* 递归压缩$ {! k- M" `: a$ x1 O9 _% F1 z
解压也很简单:
! w, H6 b% J4 A0 B9 Q# A, V# C* Y N g4 vgzip -dv test.gz
8 C1 g1 m$ E( Obzip25 R2 P0 p9 s6 m) g, [
8 q) c! W C1 H( V, `tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
, ]+ ]3 a+ i% r1 Abzip2 -zk test #压缩test文件
$ n r& ~! a% k1 V4 n cbzip2 -dk test.bz2 #解压; W. h0 c3 o: ^- G
rar/unrar& _4 V7 i4 W1 w, Q Y% S
! I; X( E) R! J( j" F0 Y/ h6 R
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
3 v# k" c o- P) z; \) lrar a test.tar test #将test文件压缩为test.tar1 O3 x& v6 j% j$ o# L0 j
rar e test.rar #解压test.tar
A6 ^) Q+ E) P0 Y& A' nunrar x test.rar #解压test.tar: a0 M7 w9 R/ e6 t
压缩率比较
) M% X$ }7 D1 y8 @- I
$ ^6 d0 Y& h! [. E% ^; i压缩率一般来说:
; V* q+ z9 _3 l, v+ Ktar.bz2>tar.gz>zip>tar0 ?* x. r3 }$ w# U# y- C3 @
压缩率越高,压缩以及解压的时间也就越长。
2 M0 G2 x( B6 B( `总结1 `1 r: y3 e! I+ T& V
7 I4 X0 e9 E% F& Q5 T* @1 V& D对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。% P: t6 c+ J1 o, r
有任何补充或建议,欢迎留言^_^。$ ^+ O1 n# y- n( Y7 s8 O
" l) p* T3 D! A) d6 O) l" v9 n) x5 [& e; Y, ]1 |& x7 r
" [$ R6 I0 ~. _: i, d l% B* J
; t1 o D) x z4 d) Q) y
|