4 U' p! K2 ^) X0 O" H1 U
1 v. h9 X; b8 @$ D8 ^+ l5 y; n4 B4 E3 s4 S& r
前言8 }1 x8 f/ N* s
7 B- Z+ ^" z4 W# j( N3 h
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
% E1 ^/ i9 {) @& ]1 Jtar
0 F5 T; Z: L. o/ q- C/ L h2 g9 H4 i
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
$ G* K$ L J1 z: F涉及参数说明:
: m- N; F" j5 a1 T; a-c 建立新的压缩文件
8 g2 I2 P. y9 Z" z- e9 u U! e' c-r 添加文件到已经压缩的文件: x8 r; ^) V% ~) i
-u 添加改变了和现有的文件到已经存在的压缩文件0 o' v+ S- s4 Z, N
-x 从压缩的文件中提取文件
. H4 G! u9 i" j# m! t-t 显示压缩文件的内容; _0 E5 A" X5 Q8 \$ v, |
-z 支持gzip解压文件' @5 |# V# R5 ^) R
-j 支持bzip2解压文件
: C: e4 w& H0 E" R5 h3 p-v 显示操作过程
* ]3 \; Y% t) @: l& W* ?8 C-k 保留源有文件不覆盖
/ t( ?5 |% N y0 E) C-C 切换到指定目录0 Q! F9 }0 @: d$ O% m4 x
-f 指定压缩文件
* J+ _& @* M* M/ S0 \$ `5 \$ Y7 R/ |2 ~1 i
--delete 删除包中文件; y; h( W1 _% I, `- v1 V( ]( j
--strip-components 去除目录; r# L, U9 Q7 G; N+ @
--add-file 向包中添加文件
$ R9 D- j4 s+ J: {/ H( z! J& s压缩+ I9 }% s3 Q! w9 \- r
3 P3 L/ e, E8 ?( s' E- z归档tar包,不压缩' M/ d: I! t% z) o7 U i
9 M& X) |% i) C4 N/ Y4 z+ btar -cvf test.tar test1.log test2.log #归档多个文件
. G9 [3 v4 O2 k+ u+ w4 o3 ?: u! star -cvf test.tar test/* #归档test目录下所有文件) Y# d0 i- m' T* b# B- r
tar -cvf test.tar *.log #归档所有以.log结尾的文件 ; c* D6 D( K8 e* p# B+ V/ Z
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。, v2 u1 \# r- g: Z- }0 T/ u8 \
归档并压缩为tar.gz或tar.bz2
1 G) C- f _; c* o. Z7 d6 C$ X7 ]8 K& d* H; ]$ U
这种方式打包对文件进行了压缩:
5 u. z: g5 T" ktar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
- e1 e+ O/ ]! o# `* rtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
8 r+ x+ V) S% x/ u查看压缩包中的文件
3 C7 s# S$ E3 p# @" G3 r# X) v/ `) S, F, ?, J, }7 I
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
+ D- m" o1 w; ^tar -tvf test.tar #可查看test包中有哪些文件
+ l, N3 w. ]: f4 c- d打包后删除源文件
7 ]0 _( n* ]" J- {% v: M
' W$ r4 Q# @; F. m8 ]9 S有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
5 V* h; @3 z" ]2 D0 j* R+ [tar -zcvf test.tar.gz test.log --remove-files
$ x# F+ Z' S" n) p" r5 L打包除指定目录或文件以外的文件' J Z2 w6 T5 T. K* Q. j- o+ v
# v. M, M! U6 X5 L4 V
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
5 Y4 B- Y7 t. I5 y% k2 R9 ktar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
8 F' d0 M2 e* V0 v1 h这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
H/ q; z x7 Y1 J% \( s' K8 `向压缩包中更新文件; K+ x7 x0 {% z8 D. x
6 {8 O$ w2 E5 |: `8 Z% Z3 w例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
: A+ R* {: g# v* q% ytar -tf test.tar --add-file=test #只针对tar包
. F6 k. U& R* F' W) A0 G向tar包中增加文件
. c5 g8 D. ? [* ?& }; ]$ q
, G& L5 i) N' b ~1 Q) T向tar包中增加文件可使用-r参数:
- O' V6 h4 e: x/ `- M( T, Qtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包2 w( e% a O6 M4 ~" ^ {+ ^
删除压缩包中的文件5 C9 c- K/ p2 P5 v$ e7 V
5 r% D4 e8 A) R2 [1 n) T
在不解压的情况下,可使用--delete选项删除包中的文件:8 I6 q, J1 i9 M/ c# U- h0 ~% o
tar --delete -f test.tar test1 #从test.tar中删除test1文件
) Z2 W2 F( t i解压
, P7 Q3 H4 ?+ H
& b9 H2 |( X- c4 e: a4 w- o解压tar.gz和tar包到当前目录' q1 V. B: h1 r' b4 Q
' w4 L/ m1 Y! S8 V2 mtar -xvf test.tar.gz6 @; I7 \6 r: V
tar -xvf test.tar
4 [' v' L! y _3 H3 R9 z解压到指定目录5 | `+ ?: |8 {& Z" i9 N
) {4 M2 e7 H+ S0 L9 Ltar -xvf test.tar.gz -C dir
! _5 n7 X1 @! }' p5 k& {3 etar -xvf test.tar -C dir5 F( m2 w6 w% S6 Q$ v
解压包中指定的文件
, ?& {: g" [. X7 T/ l3 _2 l
5 n9 o2 ~/ D9 [: _) C; T. w4 C% j例如test.tar.gz包中文件情况如下:1 D- k; l; o7 T; T8 t9 s/ D
1.txt4 O1 T P3 T" X1 q3 T9 b, j$ S' j
log/
- u- e6 x' |: ~: n9 j* mlog/1.log
6 l# F" y) Q5 p# E9 s8 |log/2.log
$ K: W, Y$ F/ R; h2 }* T. {log/2.log
* w n8 t% F9 ?" v) Glog/4.log7 m) X( J2 `. B8 |
log/5.log
6 T- @, a7 ~1 k如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:) n, f' x3 |3 G$ c. V0 J3 [
tar -xvf test.tar.gz log/1.log
1 k6 z( ^" e* ]tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
$ A. m8 @ `& _7 s解压时去掉目录结构4 A, a$ H) p4 T3 _; c
N, W+ D4 ]3 k# V& ^8 D压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
t3 u4 @0 C( o6 ^) Q. o- U0 ^tar -xvf test.tar.gz --strip-components=1 #去掉一层目录4 [; h6 W& h3 P) ^) ] X
解压时不覆盖原文件1 R; [# M7 B% s( D: x; `' ~
5 t' _1 K1 b6 }* P1 S6 F! m当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
& r7 W+ D6 a) L/ b8 k9 a- @tar -xvkf test.tar.gz* t# C# t; g3 o4 z
特别提醒0 `4 X- n. L, l$ |$ S
i+ P6 Y! ]1 n9 z" N
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。; b& e, n5 Q3 s1 K: h
zip/unzip
9 d8 r% `1 \. n, U1 S' M3 |; x
1 `) o5 l d& m! Dzip和unzip命令主要用于处理zip包。
/ k( M7 P+ F$ m1 |0 z9 F% T- F压缩; M' {' f. {$ I( A
- u$ l% G* [4 w7 q* M9 J3 U- u涉及参数说明:) |6 |3 M1 z1 R
-d 从压缩文件内删除指定的文件。4 g; ^" v0 Y. Y& y* O
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
1 P" U( g% }1 K: D4 P* i6 L/ U-j 只保存文件名称及其内容,而不存放任何目录名称。
3 M$ P5 m' k3 V7 ^-r 递归处理,将指定目录下的所有文件和子目录一并处理。
& l; X+ M; Z `& I( g& G-u 更换较新的文件到压缩文件内。- T. d6 v; i6 a( L- ~, A: o
-v 显示指令执行过程或显示版本信息。
2 C6 i! F$ k7 q' [, w* k-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
+ l: [9 t0 Y, s( y3 A" K' m- <压缩效率> 压缩效率是一个介于1-9的数值。
$ o, M" X7 w/ m$ w4 z. {压缩文件- f: l: z" g* N, p1 v+ S8 T
( Q- j% d; `5 Gzip -r test.zip test/ #打包test目录下的文件5 ^2 Z+ i1 V+ c. `
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
# B r" M' B) C' H0 G5 ?1 |指定压缩率打包文件3 c$ J4 d+ Y4 ~5 T/ Z, X1 S
2 k, k2 l2 F# N. n- {/ O# d J H9 i
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
4 \- E2 O: }' |$ _0 d! j打包符号链接文件
9 l. T1 z7 \, C2 M
: t7 Q+ z, p2 f) s/ I/ s9 X前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:9 R* A: O( G0 G$ A- A! E( k
zip -ry test.zip test
! Z# ?8 k+ Y1 f1 J向压缩包中增加或更新文件3 I' Q- a& V. [( `$ Z, u
' C) v0 a/ L* Q; M) M% M( C; q
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
, }3 J' s( F4 Wzip -u test.zip test2 #向test.zip 包中增加test2文件- Q; X ^* g. [- {7 l4 m
压缩时加密4 g! X1 _( s; j; c7 _
' Z/ h+ ^8 z5 S- m
压缩时如果需要对压缩包进行加密,可使用-P参数:
# e' R8 P1 q$ q# P2 }5 b( g% w: D+ Ezip -r test.zip test1 test -P 66666 #使用密码66666加密
0 _$ s; R6 b" Q6 g$ _! \删除压缩包的特定文件
/ r$ E* U( L+ d" a) ~' F* Q; A
\9 C" ]8 Q& W8 U$ ~; X: fzip -d test.zip test #删除test.zip包中的test文件! T( Z, u+ ^2 a8 X4 y0 i" m t
解压2 R3 D' y: F4 x: [) [9 G
4 S! ~) C5 I5 C0 G L
涉及参数说明:
& D B& R2 ?# p-l 显示压缩文件内所包含的文件
$ W1 W" C6 {' M/ O, M( E0 S-j 只保存文件名称及其内容,而不存放任何目录名称。
7 Q# ]1 _4 Q+ `& v-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
3 F# b- P1 z; w& \1 G-v 显示指令执行过程或显示版本信息。 @) A0 Q, U1 d* J3 {5 N3 ?
-d 指定解压目录,目录不存在会创建
5 Z' P% ], L/ K8 l @' P, q. F7 l查看压缩包中的文件信息
: @: N8 ^9 N6 E3 h& a) D, G) B% _4 e6 U P- p
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息( g, w8 n& q, p ^' `! E
unzip -v test.zip #查看更多信息,例如crc校验信息等. J, A7 R; G6 b; [* N) k, n8 p2 @ S
解压压缩包
& ^# s. e( x( q3 @( C0 y3 |: s# }. k' _. f' e
unzip -o test.zip -d dir #讲test.zip解压到dir目录
( [3 q9 j4 D m# O9 X' @解压包中指定的文件
: ]: D; O7 V9 |8 V7 I. A6 f6 R' o
R/ g3 A3 d, }9 `) C: \如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
* \- R* Q& ?" O6 k3 U8 v \9 Vunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
; J9 ?$ _0 E9 sunzip -o tet.zip "*.log" -d dir #解压包中所有的log文件
* ?! ` g. f- c$ k解压时去掉目录结构7 @5 u$ c. G# d6 w, {8 C) o
0 B `% B0 h. G q9 A/ l( n, J, y
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:5 R3 c0 G* Y8 W6 }! H9 F6 F5 b
zip -oj test.zip -d ./temp ' Q7 d% G, {) T- i
解压jar包
+ e; M/ v" ?7 r8 U- |( V: s) B( H/ U6 i5 g6 @. S$ q: @
jar包是java归档包,但同样可用unzip解压查看里面的文件:
8 m' r) W& F7 v% K6 e7 b2 Q# {$ dunzip -o java.jar -d dir
4 ~. r" J0 K+ G6 t- w& Y/ `# mgzip
! y# W2 b, [" A* i6 h) u/ F% T+ ^. g$ \# L/ @5 z0 `* Z* f' K% s5 j E
涉及参数说明:
) [$ n( a7 B. P7 E- _$ Y( T C8 g-k 保留源文件1 G0 S9 D5 W8 x+ l9 P8 r" E& w3 T
-d 解开压缩文件
, I# V$ i+ g, Z/ c0 m-r 递归处理,将指定目录下的所有文件及子目录一并处理
0 V; s% |# K' ^8 o; E! | C-v 显示指令执行过程. `, D6 J8 N2 I
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:5 h2 _5 {, |; L E+ F* e( C) d8 g, P
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
% ~* H+ F5 [) i* ^3 ~: `gzip -rkv ./* 递归压缩, z2 i- a p1 L2 T& I3 g0 H; G
解压也很简单:
3 p& G# r5 j- f' i: Hgzip -dv test.gz 0 _/ T5 I4 Z7 @1 E4 t; \
bzip29 Z4 N: @0 y- n# R
3 |) P/ s: d" W) X
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
/ b8 Y" Z+ [0 U, L( y9 cbzip2 -zk test #压缩test文件
5 w( u- a3 `% J; L6 Rbzip2 -dk test.bz2 #解压5 \& N% ^1 `- B7 M3 q4 d, j
rar/unrar
1 @# k% Y5 u% Q0 k3 y2 O1 y( E$ a4 _" e) Z) {
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
7 `1 q" r9 ?) F; ^0 S- G0 f: nrar a test.tar test #将test文件压缩为test.tar! l8 r& p, r% F. K9 A+ N
rar e test.rar #解压test.tar- b" @3 M6 \; N0 Q% n: B
unrar x test.rar #解压test.tar1 K' \; g3 J; ^2 O+ t, `
压缩率比较
7 m6 i* q! {6 c+ o4 b6 K7 @9 f4 N, B$ s6 L" y. a5 M* z
压缩率一般来说:
, F( t t9 T% gtar.bz2>tar.gz>zip>tar
$ e; x7 Y }1 p! }压缩率越高,压缩以及解压的时间也就越长。
2 h8 ^# B- W+ r7 O! e总结" e$ \: C4 V. e1 e: g
. {. D, p! f" x对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。1 F( v4 j& P) N! ^5 f
有任何补充或建议,欢迎留言^_^。
( b7 g. a& c+ D! f# l7 x' Z7 ^" F6 K6 W5 k1 H; N7 i
( D( R/ W% c8 S5 N
4 E2 a: D0 C+ h$ j0 }* ~
0 V7 _5 \# ?+ E! z. Z) z
|