- r m5 M$ @, y3 u4 x! [ n& l1 l1 H! I
7 \$ D% C" y9 ]7 u2 ^" o6 Q9 l8 w前言
% V _; b3 H. W% M) h/ n; u, n# G% B) G$ D
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。' H* l$ a+ O4 z* `! K7 Q2 A K
tar! e* l7 q& {7 f( G8 M6 b
2 i2 l& }4 D/ |tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。/ Y: m# q1 {! @ K- J
涉及参数说明:
! W+ ^/ M- a: A' B7 x1 {-c 建立新的压缩文件8 R& I4 ^+ O# K/ S( `& V
-r 添加文件到已经压缩的文件
; r. ]4 H3 C, F# u4 f-u 添加改变了和现有的文件到已经存在的压缩文件8 F( g4 d7 [- z0 f
-x 从压缩的文件中提取文件: H2 b: O) y/ Z! u# E
-t 显示压缩文件的内容
& |0 } P5 N. b: b1 b% [4 C, B-z 支持gzip解压文件1 J9 T! j; \3 T" ^ |6 X! L
-j 支持bzip2解压文件 Q$ c& h# C- _, p
-v 显示操作过程3 o* Z* W# C# a8 _4 y
-k 保留源有文件不覆盖
# Y9 r" ?- U/ H1 W# ^# |2 h4 a% ]-C 切换到指定目录
% W/ n2 s0 F( j4 O-f 指定压缩文件
# Z: k; E& C, W* W" I% d' z
( J9 t7 P, }3 x7 n--delete 删除包中文件
H: V, Y$ V. B4 I: Y) @0 T--strip-components 去除目录
; I4 E9 ^0 p% I" Z8 F7 S+ \--add-file 向包中添加文件+ R! b* p/ y, B5 N, D
压缩! z. {0 q4 f# W l' _
4 U* P. C6 `1 p归档tar包,不压缩$ O! r8 l) S/ I* `
% e5 b; |' P: A g# N( J% {
tar -cvf test.tar test1.log test2.log #归档多个文件
7 ]7 ?- l* J, H `% R6 o; Jtar -cvf test.tar test/* #归档test目录下所有文件
$ g4 C2 [- R4 z6 {: Wtar -cvf test.tar *.log #归档所有以.log结尾的文件
. _- s e' N$ |3 T5 f5 ^: D由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
0 V3 ]' p$ \$ N* V' C6 i; O' r归档并压缩为tar.gz或tar.bz27 n5 K; R. O- H2 \4 @- L* Y
6 D* k: ^4 Y* Y$ I5 {/ K6 V这种方式打包对文件进行了压缩:5 c n. w/ ?* a8 h
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩4 T ~* x8 j+ m, Y
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩, j4 U$ ]1 b% ?7 D' m
查看压缩包中的文件2 \7 g/ w0 d `: C
% w2 ~" P' @2 u/ F$ I3 q
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
2 `7 _$ d2 I$ u: c0 P% Htar -tvf test.tar #可查看test包中有哪些文件
3 b4 Q/ p: G/ t6 ~打包后删除源文件# e2 x" B- e K! T# H, }& |
) |6 `, A. H: V有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:9 x! v; B& m$ X; L1 n% Q$ m% j
tar -zcvf test.tar.gz test.log --remove-files # l. j0 ]5 N- P4 L! l o; |* a
打包除指定目录或文件以外的文件8 L9 c( F4 t: ?: i% D- o
% j4 }5 ^ @5 `7 |- B+ V* `: f
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:( |* ^" V i3 U- ?; o
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件. j- q4 L9 @! L4 }. ?7 Z* _
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
3 ~1 E8 n8 D+ }5 c! Y向压缩包中更新文件/ p6 x8 _7 K/ ~) g# \% Q. S7 m
. ]0 N2 i; w+ B
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
" x" ?' i( ?6 k' A$ D& {3 Etar -tf test.tar --add-file=test #只针对tar包! X u G p* ^( ]
向tar包中增加文件
, _6 @( h4 v% Q+ N4 h, S
; E: C E. T" x2 [0 T/ K7 r% {向tar包中增加文件可使用-r参数:: T3 F0 c9 s5 ]. }
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
5 D6 j5 f: {) u `2 H/ \删除压缩包中的文件
4 O) u, ~; J# F$ m, D2 C1 V( ] [' x9 x2 j
在不解压的情况下,可使用--delete选项删除包中的文件:
2 q1 O3 t& I; L m* e: utar --delete -f test.tar test1 #从test.tar中删除test1文件
. w. E0 C. P& ~6 M+ D& i解压
; J3 E# T& i7 G, A& X F0 R) e& j+ Z [! C! b- S9 ^
解压tar.gz和tar包到当前目录
" \6 ~/ {4 t" K q6 \- S
2 k( I) [5 Y1 R; v+ |tar -xvf test.tar.gz
O8 \' `% \ ~ r! k6 c) o1 Atar -xvf test.tar
6 }* o0 Q" P& p/ |: ?4 b; [解压到指定目录
/ H% b8 J' ~7 [$ ]% ?$ Q K8 _- F* o0 i9 }6 R. Y) o
tar -xvf test.tar.gz -C dir
8 n0 N. ^6 a) ]4 b3 z# ntar -xvf test.tar -C dir7 A% z* B5 C' F- n7 X" T; q5 S1 ?
解压包中指定的文件
7 {: n* m0 P" i" C* T7 Q+ K! B
3 p6 z8 V1 h1 e: [- d4 z例如test.tar.gz包中文件情况如下:& A$ c3 I. J* Q; d$ W M6 x
1.txt
. { ~( B) V8 n& H- Q! D$ [log/8 e( \- a V% r9 B' w$ L
log/1.log# E# k% B0 z% j+ S& w3 j
log/2.log
, w: N/ w5 e9 G8 F' O% Elog/2.log6 _9 t& B8 V7 l/ A( J7 C
log/4.log; m9 o$ L2 @/ m: R X
log/5.log
0 y; J4 T& Q6 C1 m2 v如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:: t0 K8 o9 z% \6 C
tar -xvf test.tar.gz log/1.log, g% g* |! f2 l8 r2 C
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
9 { s6 ]7 I6 y) V8 u解压时去掉目录结构( T* `2 ^# f+ c' O& g. X
; R1 l7 H6 C( t- f! O( _压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):9 A+ q1 c5 _2 M9 U; F$ N) U
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录/ T0 }* Z) \, V; R6 A0 ]
解压时不覆盖原文件
) q2 S7 P! G) e8 F; e" c" {' e& b- `) c ?
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
: I- `4 u6 I6 D5 I2 x: N. f) ^% q' btar -xvkf test.tar.gz% G3 E# P) y' ?. i
特别提醒# h9 b+ j! W/ f
& M8 ^0 K4 S6 x. K: f
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
( B2 ?5 o" |) z; ?, T9 X* C5 |zip/unzip
7 q! y) e4 q8 O( m8 \, A& |
. `, G" U" {$ s) t5 Qzip和unzip命令主要用于处理zip包。8 M, h6 O! r; L2 c$ I# a
压缩
" X4 h+ u8 z% S! B/ }. h+ w0 k. s2 m: ^# k4 e. [ A+ X
涉及参数说明:9 M3 `$ O2 G* V& W
-d 从压缩文件内删除指定的文件。 S3 c2 U4 q L$ A% F5 j, V% q
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
; |1 O% L' `* N, z( Z/ `& X-j 只保存文件名称及其内容,而不存放任何目录名称。: d& M0 X9 I1 s8 A
-r 递归处理,将指定目录下的所有文件和子目录一并处理。7 x* n$ Z- O: P |" @" h1 s
-u 更换较新的文件到压缩文件内。
; z9 z: L7 y0 s- x; o+ i-v 显示指令执行过程或显示版本信息。
( m1 T/ f$ H7 ^4 s. h H-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
1 c F% ]5 {" u" k$ j+ a- <压缩效率> 压缩效率是一个介于1-9的数值。7 ^8 h8 @; f$ r6 a R1 u* o
压缩文件. Q E* N* V9 @/ Y6 L1 c
! n: J- l# W$ S8 X4 Ezip -r test.zip test/ #打包test目录下的文件
( c1 |: s/ S4 E" x' fzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
J' l, P2 ~) D指定压缩率打包文件
; K/ A9 a5 u* P/ B8 D* X9 J. b6 S( R( z8 u e+ ]
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长, L; r+ q* b" \7 _9 j! L; S# [
打包符号链接文件
: \8 m( c) N& K, u4 i
5 |; X8 B( K: q2 f; p' ]' D8 e前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:/ |0 y2 w# _# P( p7 s( c: D0 U
zip -ry test.zip test6 [8 f* v- M c9 G4 A
向压缩包中增加或更新文件
0 w: s% k2 p# q& `: }6 `- `" D
0 _ s9 z; T5 E3 K$ ~3 g, u有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
0 n$ f+ n B0 C5 szip -u test.zip test2 #向test.zip 包中增加test2文件
/ d) m( I r. l压缩时加密
+ a# B" T3 f! \) t$ a& l8 L
# d7 r, ~5 a2 c5 o% M' e压缩时如果需要对压缩包进行加密,可使用-P参数:5 v7 {4 [8 A* d. r; a+ x
zip -r test.zip test1 test -P 66666 #使用密码66666加密
|9 E' f8 I# B2 R- B, L0 k删除压缩包的特定文件
+ t# D9 D0 n2 u. H/ T3 C6 C) X9 w. I: ~7 y, n7 q n5 @5 p* {
zip -d test.zip test #删除test.zip包中的test文件
0 k7 g5 X" Z8 f" p解压6 _) R$ m0 ~$ I9 [6 P- e W
' G2 d+ w" x# ~ K% V# q! l7 G涉及参数说明:5 \' z" F5 v3 e. e" G' h
-l 显示压缩文件内所包含的文件
8 q0 g- [! v: e+ p7 ~2 h5 q-j 只保存文件名称及其内容,而不存放任何目录名称。
, b% d: `: E- e' }4 w-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
+ i& C- v/ O, y+ A' H3 U-v 显示指令执行过程或显示版本信息。5 Y7 l9 a) w" T" z* f
-d 指定解压目录,目录不存在会创建2 f: e9 [3 g8 J5 }( w. }& d
查看压缩包中的文件信息$ |. W! c& D) D2 @2 E
# V; b/ s l$ n7 ^/ {# e% p
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息( v2 O4 |1 x( }( w4 @
unzip -v test.zip #查看更多信息,例如crc校验信息等
8 h6 u, D' T/ |- d) w4 E2 T# i解压压缩包) ^ w2 x: p1 N9 K- w
; T) `8 m) i. ^. U; [9 t
unzip -o test.zip -d dir #讲test.zip解压到dir目录, z; l7 K/ l2 ~- L o' V
解压包中指定的文件; @5 @2 u) m8 m4 ]
- _, ^3 |) [! o7 J! n' a; F! e
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:, M7 p; x0 K: A
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录% ~; s1 ~( ]& R6 w$ J
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件
4 e8 \3 H! Z# A1 |: ?解压时去掉目录结构: Y8 ?, Z5 n+ b
+ T* _' a3 d" q( B/ L压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
2 r |. N2 K3 ^ X& F9 x: W6 nzip -oj test.zip -d ./temp
2 y p4 z9 Y2 {( g/ t+ S0 ]/ M解压jar包2 i. w/ F0 k l4 w$ V
+ Q+ e, q/ |9 R4 ]1 P
jar包是java归档包,但同样可用unzip解压查看里面的文件:
% @3 |/ U8 _; R- Cunzip -o java.jar -d dir( G' A1 I' D' v5 c( F
gzip
' C, R5 j8 A" A* n8 [' Y7 J* A* I; Q& T+ o1 m" y0 v! B
涉及参数说明:2 `6 e1 n: E0 k6 B6 ]
-k 保留源文件
, Z4 x7 W. G. V9 i-d 解开压缩文件
# [ t$ g( C9 K* ]3 e" i-r 递归处理,将指定目录下的所有文件及子目录一并处理
' `3 R. o V" y5 t-v 显示指令执行过程
0 Q' z* _8 D1 T5 ftar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:+ |6 g5 I0 D& H+ A# I9 |
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
2 \5 S8 M: z d' g7 r' n- d+ Y6 Wgzip -rkv ./* 递归压缩
" o# g( R: ~0 M3 G7 h1 x# c. p解压也很简单:
4 \" Y& b/ u9 Z. I: d' ]+ l: @gzip -dv test.gz 7 a; G' ?3 {- Q, E
bzip25 r) K& v0 q3 w) B' @' G2 _! t
% Q9 y$ N0 o! E; ~9 S% w
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:0 N. j0 i4 Y/ n* A
bzip2 -zk test #压缩test文件
" ~; ?4 Y, d- `2 [! Ibzip2 -dk test.bz2 #解压* `/ V. \7 |: ~. f, O; n
rar/unrar
/ Y. `8 I9 n+ Y, S$ s
3 b. L) j) n0 |! v* d" Frar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下: m$ F3 @, `8 i& o( f; W) z" c8 q
rar a test.tar test #将test文件压缩为test.tar
0 _8 b- B+ ~5 `( l) Q! Jrar e test.rar #解压test.tar5 H8 i4 b7 L* K9 b& r
unrar x test.rar #解压test.tar9 \* Y6 }' @- O1 B6 E2 \. p) U
压缩率比较. [2 `) @$ Y/ d4 ?4 Q
) { S2 a! ]! t& \
压缩率一般来说:4 s4 i" o3 Z6 q" F/ s7 Q) D, ]- t
tar.bz2>tar.gz>zip>tar+ M3 ^8 h3 x% M+ Z3 I8 S
压缩率越高,压缩以及解压的时间也就越长。/ D1 M$ U& @# x4 C8 u+ c% F
总结
# E! z) c3 U2 E: Q3 r5 Y3 ^
- }+ d5 s, ]8 v% G& {: L对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
! `$ e1 f7 v5 \1 k有任何补充或建议,欢迎留言^_^。( M* B5 [+ i+ l7 \) B1 A) [
: a4 H) L$ |% A# K) B5 Z* ]
5 `6 N1 N4 X: ^/ z% k
0 ^+ E- R/ H2 d, l0 ]. g4 k& h+ ]+ x. m4 F6 p
|