. W# f/ ?" O2 M5 b% h$ C) I' Z7 a. u
8 U4 d X7 c, [9 a& b+ t7 T
0 k: T* W8 e0 K+ w前言 g, z8 p m- r, [$ |; j
4 [! v7 S& L& {
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
+ y. R# \& K' {' ~1 r) }& I+ Rtar4 ^" c E D9 K. {7 ?6 k$ A
5 I5 Q9 t# d d# Z. i2 Jtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。9 i. c! E/ U4 k1 P0 _
涉及参数说明:
7 W, U' [9 v1 J5 e$ j0 l-c 建立新的压缩文件
: V! v% e+ E* [1 W: H) k. w% @! O-r 添加文件到已经压缩的文件
L$ x. J1 ^8 s7 a$ c9 q6 F8 b" e-u 添加改变了和现有的文件到已经存在的压缩文件
& c& w& I7 J0 _, R7 g-x 从压缩的文件中提取文件9 c% b) l' f: e" k( ]' G
-t 显示压缩文件的内容
2 t! S/ h6 \+ m. f/ a( P, T6 U. ?-z 支持gzip解压文件
& Y$ l& |+ h( B-j 支持bzip2解压文件+ K; K/ Y: q- F+ b5 X
-v 显示操作过程
6 h( j. f: Q: M6 ^( u2 u7 u: N-k 保留源有文件不覆盖
* j3 E; U. Z2 m-C 切换到指定目录
7 ?, v a( ?$ _6 N' ? z-f 指定压缩文件7 X& L0 f/ g; A; e* Z6 \7 V
% D) d! L' p+ v5 O--delete 删除包中文件
% ?: Q. W' ?5 {' g--strip-components 去除目录/ t, x5 w! e3 y4 M* L2 g w% c
--add-file 向包中添加文件* j- E7 I7 I! C1 i
压缩
3 G/ w5 Y. o* [# i
, T. u2 u+ L' P& b. C# n归档tar包,不压缩! H. b( W+ w* t$ L) }' K: O
( q) E+ X0 N+ C" ttar -cvf test.tar test1.log test2.log #归档多个文件
$ Y- g. V6 E) r8 A gtar -cvf test.tar test/* #归档test目录下所有文件
$ d9 @' V( Z5 Htar -cvf test.tar *.log #归档所有以.log结尾的文件 0 y; j5 E# E6 `+ J3 O% l6 a' M* j
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
% q! E% G3 G8 t归档并压缩为tar.gz或tar.bz2' s. S) F9 l- Y% S% x2 m
3 I! y( i; _# }
这种方式打包对文件进行了压缩:
+ J- M# r6 d8 j! v% d6 G' c# Ttar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
! H' G# x7 E* x+ u# ftar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
+ _3 y( q3 n2 z1 E; [" @查看压缩包中的文件
9 H: O9 ]# Z/ M) E6 n6 y/ [9 B, }7 \) Z
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
9 c4 x& \7 r" @: N7 a9 K6 ptar -tvf test.tar #可查看test包中有哪些文件4 h! {' }3 r/ X) c: H' a
打包后删除源文件
0 V/ ~( R5 @& Y/ D( e+ g9 Z, h6 S* Y+ H! m4 |) n9 ^' f/ ]
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
8 c4 {" u4 R0 `0 L" U6 J% n+ ztar -zcvf test.tar.gz test.log --remove-files 3 R- {- h: j4 m) ^* }
打包除指定目录或文件以外的文件8 w- l p8 g/ S0 ?& a' j
" I: r, y) R8 o8 z. \对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
% l' ~, |) O4 G0 ]+ mtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
) ~# n% \7 {0 s6 U6 u- H) K8 A这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
* J& V$ K7 O2 f& O向压缩包中更新文件
: Q! ?* v! i) }1 e w' T, r9 v5 y6 ?" d$ x# g
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项: L1 r. p8 k$ Q% J4 C" ^
tar -tf test.tar --add-file=test #只针对tar包
, }0 j; _! x, ]- {; H9 a1 R+ _向tar包中增加文件
5 f+ I; ?2 `+ K% J8 L& U* _6 I3 l1 [9 g! g
向tar包中增加文件可使用-r参数:
5 ^$ U& `+ {' [" c* i) P, qtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
$ v, K8 L0 `& U( _6 h删除压缩包中的文件
$ d# d- J( B5 G# W2 m; R4 A* e2 K% ~4 V5 F4 S3 [/ g+ j
在不解压的情况下,可使用--delete选项删除包中的文件:
; P8 d3 l r4 z" b6 C3 ftar --delete -f test.tar test1 #从test.tar中删除test1文件
3 u- H7 y" q/ R解压
+ e6 A/ [. l& k0 y, H5 ]: L
( b* F- t. w, V, g解压tar.gz和tar包到当前目录. f" ^" N, X- L0 @" g
3 F6 k; T/ k" ^' Ntar -xvf test.tar.gz* ]3 g# M" `; H
tar -xvf test.tar
7 G1 ], ]8 [" |2 F! y# _, _+ ?3 M解压到指定目录* l2 K% C' N ^* W1 ?1 t
# w, E% X# L/ N+ h: e) V( d; t
tar -xvf test.tar.gz -C dir
$ M: i& w: U) h$ {, Htar -xvf test.tar -C dir3 g( f' n( A# ?: _1 r! A
解压包中指定的文件
4 s" E: c% E$ v* Y; Z( Z& ^; L* o$ b/ g. Q, D; F1 y# Z5 ]
例如test.tar.gz包中文件情况如下:4 a0 w! N& V0 W, B, C/ f6 g
1.txt; T! u! o; s/ C, v) C* d1 [
log/$ N( [* q- w& g- F& B8 t0 h
log/1.log. A+ _$ B/ P( G' @" b
log/2.log5 D' a/ T2 |% l8 t
log/2.log# \5 d4 L, v- R- X( @
log/4.log
& l0 n5 b4 f5 ]4 q! d# }% [" M- i* ilog/5.log
% h0 V; W) E8 P, m, h: W如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:7 K( v2 @" C s; b2 A) [
tar -xvf test.tar.gz log/1.log% C& n5 o5 |# m, a% _3 D6 Q9 b
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
* \6 N7 ^2 B' |$ _3 ^' U0 u1 d解压时去掉目录结构
7 n. \. P) h& _0 d6 z7 J9 ^( a0 q. f/ F
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
; Y" I9 ]0 W" I+ a& }tar -xvf test.tar.gz --strip-components=1 #去掉一层目录! z5 A$ {5 F4 I( W K' ~6 r/ ]
解压时不覆盖原文件
9 a: A( G2 K w! g
; B& J* T5 d5 q3 J, T1 r' O当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
8 c. }* G( T/ T- [tar -xvkf test.tar.gz
! j5 e5 ~: y. A* E/ k5 q; L特别提醒
3 R! B+ }+ G8 L2 T/ q; i7 t2 R) h5 n! q
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
5 H( |0 @7 }1 d- Gzip/unzip4 d, }) d* K+ i: n/ a: V
0 `$ z* R9 j( E9 H% F
zip和unzip命令主要用于处理zip包。+ ?0 [8 ~( H5 Z3 ~) D& }% `
压缩
4 h- {$ a/ J$ c! p3 {# G
' L: ~& T0 k2 E* `7 f! M9 |% ]涉及参数说明:0 `8 ]- S& F! c- }' T2 U- A" G
-d 从压缩文件内删除指定的文件。
3 M+ D' S( @! ?1 E8 t! J-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。* o* u- h( u' v* f3 l% F
-j 只保存文件名称及其内容,而不存放任何目录名称。
. N+ F) p1 t4 k3 d' v-r 递归处理,将指定目录下的所有文件和子目录一并处理。
/ Z% z4 R$ C/ o( ~! I-u 更换较新的文件到压缩文件内。
/ p" p/ ^+ j: O3 s, l0 p C6 \$ r- i-v 显示指令执行过程或显示版本信息。
! p* I+ }' p, H, ^( Z2 _7 o$ G% h-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
& K( Y& ?" A8 L9 V: ^) v- <压缩效率> 压缩效率是一个介于1-9的数值。
' m! d/ ~3 x4 x O) }' W, s压缩文件
2 k4 i) L& x: F7 M& j, _. E
6 f0 s- C; q1 Q, H, i5 K! zzip -r test.zip test/ #打包test目录下的文件
' K: v( h) D1 hzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录/ o* w- G3 \ K+ W5 U- k D
指定压缩率打包文件1 G! c6 I$ U) y4 J, ~
5 r! z1 y' o1 F3 `0 {& j4 t' }0 a( F
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
0 l: a* ~3 ~* p% R* Y: w7 D( [打包符号链接文件
3 [' s: A+ `: M. t) v
x3 q* |! O5 h4 F前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
7 t( b4 D' S/ k: N2 L/ g% uzip -ry test.zip test5 s* t! K' o- g9 ] K* ~3 c
向压缩包中增加或更新文件1 z% e* k1 J; u3 i4 f
2 l* d* t1 A3 ?- X/ I
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:. W4 W0 ], y& l
zip -u test.zip test2 #向test.zip 包中增加test2文件
# g$ @" H7 |- Y) V压缩时加密; n; ?" @$ K. D7 V6 b3 a# B
0 _5 k; y( c, k4 V1 a. j9 ~压缩时如果需要对压缩包进行加密,可使用-P参数:- G, J. c- q: I X! Z
zip -r test.zip test1 test -P 66666 #使用密码66666加密& F# H$ w3 b% S4 R
删除压缩包的特定文件7 @' ]! ]3 n1 s/ T: z% x
8 ^1 Z1 Y: j1 l: J$ _
zip -d test.zip test #删除test.zip包中的test文件+ B! z1 Q7 a9 q m( [6 c) A3 B
解压
- Y6 p5 K$ a. ]8 B6 Q9 O
2 Z" k" u: {- K. S5 x涉及参数说明:
4 A# b! M$ z. I0 x2 u-l 显示压缩文件内所包含的文件
9 Z8 L1 y# c7 U4 j( v5 @) o-j 只保存文件名称及其内容,而不存放任何目录名称。. @) ?& a* J$ E u5 Z6 T
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该2 N7 X3 N( r. g# D0 k% w+ ^5 r
-v 显示指令执行过程或显示版本信息。
; j6 W E" {# N p0 e9 k! ]-d 指定解压目录,目录不存在会创建" U7 \3 J8 W) u, r- \
查看压缩包中的文件信息
9 {; L$ j/ c/ L, r
/ X: Z) b, ^0 C# U/ s! vunzip -l test.zip #可以看到压缩包中的文件名,日期等信息- g% U$ \0 A) m) K$ }5 |5 E
unzip -v test.zip #查看更多信息,例如crc校验信息等* @" j7 r7 g8 V. M9 f/ u" ]' ^
解压压缩包& ]2 l' G- m5 X! w* f" V
0 a) v3 o6 T3 `+ f
unzip -o test.zip -d dir #讲test.zip解压到dir目录+ V7 a% Q8 S8 _+ @9 |4 `
解压包中指定的文件
+ X1 |5 w! `) d |- U9 C% w4 g+ l8 u# c' {
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
1 D5 H' M2 u ounzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
/ I1 Y7 @3 e# Q' f0 J5 S) Q0 Junzip -o tet.zip "*.log" -d dir #解压包中所有的log文件# @2 R7 ~- m: M. |% _+ b
解压时去掉目录结构
, J. k) l$ ~0 b- O1 Q8 a) c! V1 M6 h& |
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:. Y* q: F, B: l$ ]) F, a
zip -oj test.zip -d ./temp ; U) {. d" ^" X- s/ h" c! j
解压jar包9 ?$ @' s4 L7 L* B
: B. f" q1 H$ Y( F9 ^jar包是java归档包,但同样可用unzip解压查看里面的文件:
: _! m* a6 E4 C" s4 `% L tunzip -o java.jar -d dir
/ Q0 {9 u& K8 y3 N6 Kgzip( }3 o0 A& m, ~
* _/ S( @; M( K
涉及参数说明:' Q2 X/ r; {% ?
-k 保留源文件
) q2 p6 d0 F/ _1 T- Y-d 解开压缩文件0 x5 J/ k0 o6 ?0 M) m
-r 递归处理,将指定目录下的所有文件及子目录一并处理
2 z; N+ L6 {; G6 {& A2 ^-v 显示指令执行过程1 O: R; K. H: W( \* T1 z: F
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
# X" D: I. r: O3 P0 n9 t/ _gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包7 s' t1 m: o1 F$ f1 F* D
gzip -rkv ./* 递归压缩' R" m g1 D7 ? \- b8 Z% G8 i
解压也很简单:
2 |. M2 F6 Y0 {" ]5 [ Vgzip -dv test.gz / f$ K! `- d% D: s* J1 ~
bzip28 l$ e1 H* e( M
( N5 K! [% P2 k1 ^: w
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:$ p7 }* l& f5 {5 ]
bzip2 -zk test #压缩test文件
: D+ G, l% ?2 \/ g6 {# \bzip2 -dk test.bz2 #解压. M3 n' }$ |0 F# c5 L0 Y- {2 ^
rar/unrar& m7 a2 M: ?2 w9 B
+ U# s# Z& F# i P( B4 T& H
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:* {+ ^- o/ b8 _4 i
rar a test.tar test #将test文件压缩为test.tar; s. L/ M* @( w" _! _ h
rar e test.rar #解压test.tar8 }/ x5 H- H% Y8 }! @, T
unrar x test.rar #解压test.tar
, ?( A/ ] w7 W$ U# |" N7 x& @6 H压缩率比较
& Y( ?0 B% J) ?0 Y* t9 Q% P5 ]$ K' z2 |( L
压缩率一般来说:3 r8 d; ~7 K* L$ l
tar.bz2>tar.gz>zip>tar
7 k+ v$ z2 B, r. Y8 e# n6 d压缩率越高,压缩以及解压的时间也就越长。
& K$ x9 o. [1 ^总结2 t/ y' d/ d, d& w4 Q
9 q+ L3 O( ~( x/ t对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。4 i- t( f/ N6 p: I' q) V+ J
有任何补充或建议,欢迎留言^_^。
3 b B1 D% @/ F7 u1 D3 b4 Z( R9 ]$ O/ G
' z# ^' d3 W( h3 C7 {3 `7 v: l s( n( H8 O2 S6 H: P5 E9 _- R! q
- H7 s- P) p: J* g
|