: ~4 }2 C; t3 y, y, [1 ~+ j
6 I- o5 @5 }: ?) |9 M$ S* Y2 `+ W6 e8 ~( I9 |) `
前言
* e, C5 @3 f6 k& l' z7 j: x+ G7 H- G) {5 u) {7 C
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
5 X0 ]/ V; @) d& r7 C6 U0 `tar& l3 B2 a7 p/ r3 ]+ a
1 C7 S7 _! G5 F6 R' i9 N% W9 G( M
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
! Y( i# e* D& ?5 J涉及参数说明:7 ?4 ~; z+ [0 l0 t0 B1 R, D& D
-c 建立新的压缩文件
% c2 U2 i$ S) `1 L-r 添加文件到已经压缩的文件
1 f* i z+ i- {8 }4 V: ?" v-u 添加改变了和现有的文件到已经存在的压缩文件
* @7 u F& U5 m/ h; e/ m1 T6 a* Q2 J-x 从压缩的文件中提取文件
0 J5 O& E) B- G, e-t 显示压缩文件的内容, I9 }# ]* J. D) U& i3 w
-z 支持gzip解压文件 K2 p5 n; M8 V# J. ]
-j 支持bzip2解压文件
) I. o9 G/ R: Y-v 显示操作过程" b$ Y* K! Y1 ~+ D
-k 保留源有文件不覆盖1 N" m9 h4 G: Q+ E! i
-C 切换到指定目录 T2 y# Z) c& F# E
-f 指定压缩文件( ^5 [: ^4 t0 c4 C6 h* Y! [
( M. w2 A) t/ f# K--delete 删除包中文件- O0 h1 I" g( R% ]# p* f$ W2 d1 c
--strip-components 去除目录+ R a7 o! r/ q$ m+ ~9 h" ]: @# R
--add-file 向包中添加文件
/ @/ A* Z- ~, w( g8 p压缩1 ~" e( G7 I6 T+ B1 g4 F
" z3 }+ s5 n9 ]2 g. ^* l! t
归档tar包,不压缩
7 ^% P2 Y2 b# \. {9 W/ m! e" g& f
" s+ V; S$ O9 h* e8 ctar -cvf test.tar test1.log test2.log #归档多个文件5 w5 W1 e$ D+ R0 Q6 B; T% ]$ e
tar -cvf test.tar test/* #归档test目录下所有文件
) {! q* M, N5 }8 d. k$ B; _- Star -cvf test.tar *.log #归档所有以.log结尾的文件
) P' j5 m: m9 y u! S7 Q由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
) P n' ^" Q# E4 F" d归档并压缩为tar.gz或tar.bz2
/ R: d" E: q4 j$ O# d J3 d+ \" {7 w( z. F
这种方式打包对文件进行了压缩:1 Y# ~3 \" o1 F. S- |% o7 u
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩2 l5 X# f8 N$ Z1 J+ q) \
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩1 ?* Y$ { X& T- S3 ~
查看压缩包中的文件9 f) s" x3 q6 l V/ t$ J9 e' T
. Q+ B' u, z1 e3 F, C0 a8 G如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:9 b) d+ z, s2 p. I: y+ q
tar -tvf test.tar #可查看test包中有哪些文件$ B2 B/ K }# s, x: L
打包后删除源文件1 L2 X: }: _' H4 ^8 ~& c" Z0 D
+ K+ }- n! t( Q0 I7 q有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:( \. }5 S+ x! V6 I
tar -zcvf test.tar.gz test.log --remove-files 1 l3 |0 T' ^, o
打包除指定目录或文件以外的文件: S5 G6 n1 k- N! J/ s3 j. o& {
. q: R% A9 w }& X" ] k% @' e8 Q9 a
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
6 _9 g9 p$ G2 ^& O# D1 k8 utar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
: @8 G7 N& t" q% Y+ s" ]这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
9 j8 D( \: F* x( H5 v1 A向压缩包中更新文件+ |9 ?5 f4 h# k5 b+ U
4 ]& l2 _3 {' ]% m
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:) b3 s G6 V; J9 _( d h& |
tar -tf test.tar --add-file=test #只针对tar包
# k, e' }9 y$ v. r" _& n+ }向tar包中增加文件
/ Z/ k+ z( I [0 t* h6 t; r+ f) `& A+ u# W
向tar包中增加文件可使用-r参数:
. a/ k R% L5 r! Atar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
j' g3 i' K9 A# e( T$ {! [删除压缩包中的文件
' a$ @$ Y' y# ~5 ]
/ G) s0 |+ C& J# v8 u7 H在不解压的情况下,可使用--delete选项删除包中的文件:
" m2 I$ o3 I6 L# P8 V- {' e9 Ntar --delete -f test.tar test1 #从test.tar中删除test1文件+ g: H( y5 p [% o8 ]! h$ {
解压
6 b7 h- K, d. o8 m( `& F& u5 v7 p ~5 S% f: ~; Q
解压tar.gz和tar包到当前目录
3 P: }8 E2 n' s: D, \1 r- ^
0 `4 C6 d: y& Etar -xvf test.tar.gz
, [, h O# U. g" b2 C/ }/ ktar -xvf test.tar
' ?/ |. ]3 d! J5 P- j; S B解压到指定目录
; E2 K) j# W5 G+ I1 l
: L& W b& ?2 l- _8 a; rtar -xvf test.tar.gz -C dir4 g' B& \, s q8 x
tar -xvf test.tar -C dir
' Q3 R; M6 A9 A6 Q# M9 ~: G解压包中指定的文件: f; M1 ~, S" U# d. @
o$ U3 j/ T" [例如test.tar.gz包中文件情况如下:
8 ?% B3 P: O' y' u( e" `( w1.txt
3 b9 U$ @0 d! f4 j" q i7 S1 s: ~2 Blog/
9 {0 A/ u0 p/ J* G# E' e9 Flog/1.log3 N0 B: g( n3 f: |$ P! j/ y9 E
log/2.log
, Q0 B/ C5 ]8 a9 p. Alog/2.log0 z) m7 d* ?: y: {6 G! d n
log/4.log8 N. P( J8 i% h B) Q
log/5.log
3 ?" F {* \5 V! ^3 X如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:# U$ [% j6 i$ E) k. [% }
tar -xvf test.tar.gz log/1.log
; ^% S$ a T$ G) \2 C. h$ L- q; Rtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
* L/ N) K0 [9 ^解压时去掉目录结构1 k3 @$ U1 b& H! l/ z4 n
: [5 O# C) C* R: Y2 v% ?) l% {
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
5 `# a" N3 _; z* ktar -xvf test.tar.gz --strip-components=1 #去掉一层目录
e7 x6 G; _& ^ Y( M解压时不覆盖原文件$ x7 G! \# W8 c- `% l3 Z
: u5 Z2 B" e% A1 }# ]
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
0 {5 r; g' T9 T8 h/ C" O0 \8 D1 ltar -xvkf test.tar.gz5 ?* k1 U' i' z4 w C3 A, A8 b+ ` K
特别提醒
. M) z R5 w. t% f) K0 M8 {3 X- C2 O& v" x' E+ ?5 J
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
], l# d! C* x& R2 v" ]zip/unzip; O5 a$ n8 Y5 C2 @+ ]
# w' ?4 U" M) f
zip和unzip命令主要用于处理zip包。
- Q8 ^1 z4 B4 i7 G! y8 w压缩" l, _8 r4 F- W( g$ U
- j' k" D% i4 `/ D3 e涉及参数说明:
! H9 E' l ^; {! Z3 b5 I" c-d 从压缩文件内删除指定的文件。$ s* X9 {3 J7 V& w; ?$ z5 U
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。5 r$ X; r; W) C; W1 f
-j 只保存文件名称及其内容,而不存放任何目录名称。
2 C i2 k& E5 ^1 h9 Q- ?; J8 T% o-r 递归处理,将指定目录下的所有文件和子目录一并处理。
0 Q8 C" W) A. R+ g# ^-u 更换较新的文件到压缩文件内。! W3 m, o4 C* i6 B5 O
-v 显示指令执行过程或显示版本信息。
$ [5 g/ R$ t, B8 A: f1 \7 u-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
0 N: ~# o! g5 P" s6 g; ]7 o8 k6 R7 M- <压缩效率> 压缩效率是一个介于1-9的数值。
: M. ]: b ?0 H l6 @3 F( q压缩文件
- B0 [( }% ~8 Q* J; y1 p6 u1 ^6 O2 D% z
zip -r test.zip test/ #打包test目录下的文件" r+ j# ~, q5 ?7 `( G
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
- O9 N2 J4 u+ @- _# K; p9 m指定压缩率打包文件5 _1 ~9 g; h3 m
' r0 z) L. A4 z2 \
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长. y; A2 V" p6 F! I5 F$ N& Q
打包符号链接文件
. e! o3 P* E$ L0 w' I! u) d6 M" t% L5 e- a& A
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:) M% W6 W; G$ `+ w% b) }
zip -ry test.zip test, R% f& A& r; R$ X0 T9 {
向压缩包中增加或更新文件! z2 z0 H* Z; Y7 _: h! L
# q& n8 |6 F) r& N( q3 a( z$ Z有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:/ {4 O H9 I: ]& _( N4 J7 Z
zip -u test.zip test2 #向test.zip 包中增加test2文件
- p+ f. v; s) L* u; p1 M压缩时加密5 w8 o, l" L5 y& e' h! F
- ~$ ~. j1 c) ?% X5 M& p压缩时如果需要对压缩包进行加密,可使用-P参数:- t6 ]- Y p% I6 V; A+ L+ D
zip -r test.zip test1 test -P 66666 #使用密码66666加密
) ?3 k8 U. A3 k# Y5 f删除压缩包的特定文件
& w7 N8 j" K: J2 |+ c3 `
: d: b/ s4 {: g$ F7 y7 Qzip -d test.zip test #删除test.zip包中的test文件 }6 n; Q- M \) N
解压/ l* n2 y* G; h; a7 p k
5 _) T# N4 G. v e& q a
涉及参数说明:
$ o3 b! Z1 O$ S6 u$ R-l 显示压缩文件内所包含的文件
. O$ Q6 s8 h7 \3 Q' t-j 只保存文件名称及其内容,而不存放任何目录名称。 `4 p7 H: L( D3 R# f
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该& l+ O5 K7 j- `/ m3 v
-v 显示指令执行过程或显示版本信息。
5 j9 l; _& X) T4 X" t-d 指定解压目录,目录不存在会创建
' Y- Y) ~0 k0 a. _7 X查看压缩包中的文件信息
- [/ Z& t/ T" [* _; y% N9 W9 U# f2 w' V2 C6 o
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息# O9 A6 {" P) x9 a; M& T# z
unzip -v test.zip #查看更多信息,例如crc校验信息等( y2 n# q! a/ m1 _9 i) W) N" U. `
解压压缩包' x/ h! {* j5 G0 v' u: Z2 h( s
4 G1 I2 o3 T0 N% {( Q$ qunzip -o test.zip -d dir #讲test.zip解压到dir目录
5 A- E9 `" L. X& ]6 R解压包中指定的文件
" z7 {1 K8 n" i% t: U: U) q* B# X: `8 k4 s! t* l
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
) P! f) x q3 c2 u5 u: \unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
( ^ Z0 r5 |: J6 \2 }- [3 wunzip -o tet.zip "*.log" -d dir #解压包中所有的log文件# U* l4 E. A! C- K" b8 y0 `
解压时去掉目录结构; K* |+ B! ]( p
- j! Z; j8 H9 w" c/ D! G
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:4 [5 k" R" M' V0 }2 r1 X
zip -oj test.zip -d ./temp
5 y/ n' p% l* G f8 {解压jar包
- f2 `* i7 l, Z. G1 b9 y' _# D, H) K; v2 Q
jar包是java归档包,但同样可用unzip解压查看里面的文件:* E2 f: C3 ~7 Z4 e/ A2 A
unzip -o java.jar -d dir
- u+ |. ~4 G- ?' H0 G+ ]1 l: O' rgzip
$ Y! L5 R1 M( q" A* r. }. ]3 P5 S4 f0 r: I
2 d$ k' j4 H" u涉及参数说明:
6 ]9 t- t1 [3 k! W" S( [5 I-k 保留源文件
( s5 B9 J. X* E* I0 L# O- E: \: ^3 m-d 解开压缩文件
1 u% L. a# e B6 \. _ P2 ^% Q! [6 _-r 递归处理,将指定目录下的所有文件及子目录一并处理8 E$ P4 d2 Y; y( @; ~
-v 显示指令执行过程( C% m. l8 H( |) H! e9 g
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:1 \8 C5 C" X$ v2 C0 {
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包* r. \; |0 s$ B3 [
gzip -rkv ./* 递归压缩
( s9 s. E8 |* o) Z' X# W解压也很简单:
4 i$ u" O. H( K& M' P0 Ugzip -dv test.gz
" C% B I# f% bbzip2
' M6 n- z8 {+ H4 ?4 ?, @: Z2 [6 a6 _% l0 b" Y9 |) a
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
f% S2 D1 F9 Lbzip2 -zk test #压缩test文件
7 _0 y" h, J+ r0 Jbzip2 -dk test.bz2 #解压
( d9 ?' x/ M' H- h4 _2 \ arar/unrar5 u: M9 c6 K; g7 [
3 P( P) e8 n! N) d6 D" O/ y6 I: _
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:) w4 w& S! e% q7 N9 J! a( v: |
rar a test.tar test #将test文件压缩为test.tar( i; V9 K, ]* t2 ?9 ~4 A
rar e test.rar #解压test.tar
1 S" ~( \$ L$ v+ W# A4 }unrar x test.rar #解压test.tar/ ?4 D1 z) w9 H9 ]
压缩率比较0 L+ u1 n0 v, s# l: Q* G) h! F1 U0 q& v
3 v, p) Y2 [; {
压缩率一般来说:
& q( c* c; O; ?tar.bz2>tar.gz>zip>tar
& Y% T, k3 ?3 P. F9 r$ r, ] d3 ?6 s压缩率越高,压缩以及解压的时间也就越长。
7 C$ i: e9 a) q' k% b9 k: }! e4 t总结6 T3 e% s( ^ l1 L8 h9 Q/ B
9 B) w- l( s/ v2 r. Z对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。* D8 ]# B8 R: e7 d2 |" S
有任何补充或建议,欢迎留言^_^。
3 G/ t, Z5 o# C- \
. j6 s1 @( R" ?
/ z& s, w+ d6 [# u; f4 E& n7 [3 v5 X6 p# U* @
9 i! f) r' p: Q( j- r! ^- ]
|