4 W+ n1 p; m$ f
0 }. T" n: ?7 i. W6 p- m
7 @: x8 R( {# b2 P, \0 k9 R" x
前言
3 i @/ `0 L- Q3 H5 [, h2 @/ w8 J9 e
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
3 E5 {& S# Q& h, b W: U& ltar2 ^0 S6 |# i, L' L/ R& A+ i
* s7 M) M5 T& w% L/ X1 t
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。+ M: L F: I( m' L- F1 P: O3 g
涉及参数说明:
8 j& Y3 V, W! E1 U: ~! b" h" y* Y, t-c 建立新的压缩文件: `$ x9 s. U+ I$ v& _7 _
-r 添加文件到已经压缩的文件
' D9 C- `6 A& H1 c* B8 f7 N; R" u8 a-u 添加改变了和现有的文件到已经存在的压缩文件
, ^. c; t0 G7 X" N5 X-x 从压缩的文件中提取文件
, M7 N0 k$ L% ^3 X-t 显示压缩文件的内容
7 {. k2 q0 B1 Z: z8 w/ o; r! f-z 支持gzip解压文件; p, Y2 E6 c0 \; @& [; m1 }
-j 支持bzip2解压文件
1 \0 Y0 ~# O; {% R" P-v 显示操作过程2 A7 u! o2 B! ]# \& u: x" U+ ]8 R
-k 保留源有文件不覆盖
3 v& o! c5 |! H* n8 \8 @0 A7 }-C 切换到指定目录. \; ~7 A: |1 A( e- b8 @. r
-f 指定压缩文件* R0 K: v. h2 c8 s) y
) x# e) }% \+ n
--delete 删除包中文件
! ~1 [% M1 ~% h9 a--strip-components 去除目录, _$ ^9 @) M5 S) H0 V' B
--add-file 向包中添加文件
) H0 P' G' R" [4 O8 a+ l! @压缩
% v# u5 s- F/ w* l, P& Y. E3 C7 |- E# K- V+ m9 q
归档tar包,不压缩" M* W0 h7 _4 I% V, ~
* Q9 A6 [. X @
tar -cvf test.tar test1.log test2.log #归档多个文件
- T$ n( w4 @7 t4 P# N+ ztar -cvf test.tar test/* #归档test目录下所有文件
6 v, M q8 K2 t# F8 u) T0 }& ~tar -cvf test.tar *.log #归档所有以.log结尾的文件 , t( u+ N% S# B% A- Q# ?
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。" H+ M, D& I# z2 O4 `, h. T6 ~& _
归档并压缩为tar.gz或tar.bz2
L, h9 J" Y" A9 `. f7 o5 R- w. W2 E# [0 E# P$ Q
这种方式打包对文件进行了压缩:
+ G7 N/ b) ]7 qtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
. i: F9 [0 j N% E8 c5 Ytar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩! y5 w' W/ c+ h: u2 W) J6 R2 c
查看压缩包中的文件
. j" Y4 `* e9 S) p
) D% m! m2 ~* j+ Y" S) ]如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
# |8 f: l/ B' J5 G3 p9 r o& u. |tar -tvf test.tar #可查看test包中有哪些文件. R2 u7 o. s6 a- S( I$ S$ x: S! D
打包后删除源文件! |2 v/ B& j1 |, X& c6 V$ ^
7 n) f+ M( Y. F, E" W
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:9 d4 F0 \6 e& l; D
tar -zcvf test.tar.gz test.log --remove-files z l2 q. K% x- Q4 o( O
打包除指定目录或文件以外的文件
! G7 S- r) h5 @. q# {, c
' p" F% I- X1 R4 i) D2 U1 j. }- j对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
8 B$ b0 s" o% Qtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
& E9 O8 }" M+ T9 {这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
W: ?/ v- c! d% p# [/ U' q. a向压缩包中更新文件7 I, ?6 z& E& T7 y* `
0 _5 r2 Z" R) f: h4 l8 z例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:: Q: z9 @8 W0 ` k! z
tar -tf test.tar --add-file=test #只针对tar包
) `' d1 g/ `* Q; Z% B; d向tar包中增加文件7 ^1 d7 D: X3 p7 Y! L
! c4 ]# x* z6 k: o. [( V) I8 w向tar包中增加文件可使用-r参数:
1 {7 d% v: [* K- Otar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
* z5 v' O1 O$ T" B# X删除压缩包中的文件: \, t$ v7 s. J
. |2 ~6 z; p; [/ K' g! O在不解压的情况下,可使用--delete选项删除包中的文件:& v7 }: S [7 i" m+ s! D, q
tar --delete -f test.tar test1 #从test.tar中删除test1文件/ |- K$ g) N( J. N
解压. ]) X* M7 n2 H3 L; j
# p9 M: w. H* Q4 d
解压tar.gz和tar包到当前目录+ O0 Y8 s& j4 J# x* ^' i
( x+ J- o c% Y1 M/ star -xvf test.tar.gz
m% }1 @( w& x2 U: K7 K8 dtar -xvf test.tar ( c6 Z' F2 E5 X$ k4 j
解压到指定目录
4 v$ Y3 D( M7 e/ j3 `' a% s
: V5 ?* b" z" e6 c' p! ~" I8 g mtar -xvf test.tar.gz -C dir* _9 q& t- V2 f; \) `. q! c
tar -xvf test.tar -C dir. Q# b/ i. |& ^- T% U
解压包中指定的文件/ Y) K$ s# h; Q4 _8 e/ _
& J+ k4 u; V- z$ ^1 Y
例如test.tar.gz包中文件情况如下:
( S" e2 u7 n+ n m* P/ S1.txt0 m( Q3 F0 ^4 P
log/
+ h. W1 \; Q+ alog/1.log# T# b! R6 Z X7 T, q
log/2.log9 d# u- @5 e( Q) \
log/2.log
, h# Y1 `" E0 h* alog/4.log9 O( u9 `9 I) G8 t# @9 q3 I, Y
log/5.log
% Z9 ^5 S" E% c如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:; s" D: I; f) {9 K: t* ~( P: H
tar -xvf test.tar.gz log/1.log
2 f- ?9 E5 b! y$ d. J$ F9 _tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
0 t* U5 {; B( j% d* P. c解压时去掉目录结构; T' c0 K' P3 `: l0 z
2 V) b- c- A+ ?
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
7 F6 h% \2 |- e8 }+ Mtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
! J. z1 C* Z" Z1 H! b6 d解压时不覆盖原文件4 a7 c: a6 N- O9 e
! i% ?. h/ q7 V: e$ m9 A
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
2 _; x6 Z0 I$ J/ s# F& P. Ltar -xvkf test.tar.gz
8 O* J6 K7 n( A1 L1 l3 A特别提醒7 e* s" F( D& r# J% P/ ?
! K0 i% c5 X4 x+ Q( x% ^7 \
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。/ x2 a: U/ D5 V# d, D* n$ {: J
zip/unzip1 r* U! k) P' x9 Z
7 |% k8 E4 \7 ^zip和unzip命令主要用于处理zip包。
/ Y- `$ W7 F; N0 V& T+ X/ h& g4 Q/ a压缩
& S$ X, G! D0 h5 `7 e+ { o( q: V; k q* W
涉及参数说明:
/ U2 F( m! F; V) w8 {# A+ @-d 从压缩文件内删除指定的文件。
% f+ e+ s# M$ i% P) r. c-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
% g j3 l! q4 u6 k2 g" ~-j 只保存文件名称及其内容,而不存放任何目录名称。5 d4 \ R/ j2 A+ A1 w
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
2 C% ~, q( y* B2 g/ V" p-u 更换较新的文件到压缩文件内。9 P$ H2 H/ l8 Y) L0 o4 q
-v 显示指令执行过程或显示版本信息。' h/ b% k( M5 |2 [) m# m5 q
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
: u, K/ S6 M& k- V. v8 T- <压缩效率> 压缩效率是一个介于1-9的数值。; s/ R) s* _$ t1 ]: ~% ~: b! Y+ d
压缩文件
L% q0 g: U& c" X( O& |8 z& C; ^; B+ X7 {7 f! U7 \$ q) E0 @
zip -r test.zip test/ #打包test目录下的文件! p4 m& H! M; P0 t6 X& B+ T, q
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
4 t; W) C0 p( W [& d4 D指定压缩率打包文件
, {3 D9 c- H- _! y/ W4 O) O* V. I" \& S' Y4 f
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长 Z+ F2 ~* E& r! X( U
打包符号链接文件" Y7 F% I% N' N! ^) i
* W" N3 P* ]* e( x. g前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
1 f- r" w' T fzip -ry test.zip test
# `- j+ A, ~+ }5 V向压缩包中增加或更新文件" h4 O A, H: H, L9 w# w' f
' t3 I& u( B! u
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
$ V% t+ [7 w& F- f- w/ v& rzip -u test.zip test2 #向test.zip 包中增加test2文件
2 h r) Y0 s, Z+ u- |4 D" y压缩时加密
, g! v, r4 Q% i' \( h+ L1 k% E9 n) [* _6 S% g' ?5 z
压缩时如果需要对压缩包进行加密,可使用-P参数:7 e& L0 B3 I' _. D/ [& Q' }, I( m7 Z1 d
zip -r test.zip test1 test -P 66666 #使用密码66666加密; D1 ] \$ m. ~6 K1 w5 _. E/ I9 p
删除压缩包的特定文件8 ~; d7 [* I1 O; r
o F; I ` j+ {' gzip -d test.zip test #删除test.zip包中的test文件
# c# j7 P$ A! h& r5 u解压' o! L* \# H S% z8 p7 Z6 M
! u. d- p7 E( x- B1 M$ j& O
涉及参数说明:0 S. C, n" P% S0 H* _: |* H6 N
-l 显示压缩文件内所包含的文件1 r3 [+ {7 r6 y2 i: r0 s9 J
-j 只保存文件名称及其内容,而不存放任何目录名称。% e; i [; k. E
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该7 o* F. G. l" h' K" a
-v 显示指令执行过程或显示版本信息。
, z# a; X4 j; f0 I; x-d 指定解压目录,目录不存在会创建" M) ~+ e/ w: T& |
查看压缩包中的文件信息
0 X, i. `) W- @$ A% Y: A2 v$ Y2 ?& ^
% Y; Z) K* U/ ~, [7 C( uunzip -l test.zip #可以看到压缩包中的文件名,日期等信息& N! ^+ d3 C5 C+ Z
unzip -v test.zip #查看更多信息,例如crc校验信息等
/ [+ E2 J. C7 l/ l' G解压压缩包
% B% Y$ K3 [ @0 f/ a7 y4 m' q, k- S5 C: R" b
unzip -o test.zip -d dir #讲test.zip解压到dir目录6 K/ ], @0 {# }$ {2 D9 ?2 t
解压包中指定的文件
1 L) z y0 R$ r" `& v& x; b
U, p0 a; R8 B; T% q- M& h如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:) N) w5 m5 ^2 O( q$ A9 \
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录' w: }# i+ P3 u+ i
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件 K, a4 o h: H; S- ~; E/ E
解压时去掉目录结构# j+ K1 J4 z9 o9 ^5 y! c4 T
7 X. T) F% ~( |! s; ?! D压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:/ }1 H/ E- `5 W! s5 G* W
zip -oj test.zip -d ./temp
, R- _, g6 u3 |( \$ S解压jar包) Q' i3 v( |7 J
1 o! v9 X- [1 ?* H7 C8 Jjar包是java归档包,但同样可用unzip解压查看里面的文件:# L8 `1 b, j4 R. }/ w7 ^; C$ Q! c
unzip -o java.jar -d dir, u& m# N- V$ ^: R! y s
gzip4 R/ H) p+ T; }- h
- X% @, q) u4 ~- B- Z2 H8 L4 K
涉及参数说明:" k, @4 h2 A3 n& V' p2 f
-k 保留源文件
$ L) Y# j9 `- H-d 解开压缩文件4 J( t6 }) X6 n8 ^
-r 递归处理,将指定目录下的所有文件及子目录一并处理6 V2 o: M2 m% h) e) Q* V9 Y
-v 显示指令执行过程0 Z; x/ O8 _8 {" ~" {
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:- y# \: G9 h6 u! J
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
, L( U. S0 X# ogzip -rkv ./* 递归压缩
- D' D. l" X+ b* y$ o+ K2 ^5 ^解压也很简单: }: Q8 j3 d, B& Z9 P
gzip -dv test.gz
9 B/ A7 ? f4 A7 \' Y8 ^bzip28 r1 w9 Q; y8 p3 r! q) }
' c! `$ |, x _8 x; `+ A
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:4 Q) G) F0 z5 a: F( \5 ^: w3 u- H) R
bzip2 -zk test #压缩test文件
7 ~1 v; c2 n1 N d' ?bzip2 -dk test.bz2 #解压
, H- Z/ V7 S& r/ b+ q: y3 X9 N) Hrar/unrar& a1 i9 u9 J& J3 J4 y
1 O5 Q; a, J# L5 irar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
8 i2 t5 N9 M! U, ~5 R4 w [rar a test.tar test #将test文件压缩为test.tar
! B7 l* j* e4 \rar e test.rar #解压test.tar
/ I( L* L+ a3 q0 z' |3 E Hunrar x test.rar #解压test.tar2 i% \; d Q: u2 Z0 l
压缩率比较
8 g7 B4 I/ s2 \# N
0 b( g% l5 r# B" z% I+ [ o压缩率一般来说:' M2 }. @4 o r
tar.bz2>tar.gz>zip>tar; ?: M9 Z N% u# g8 x
压缩率越高,压缩以及解压的时间也就越长。2 @' Y, Y% { y# W" F
总结7 g* b- o7 q% r. n
6 [ H1 y9 K$ W- a% {* z对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
6 V5 e7 ?; x5 Y9 r有任何补充或建议,欢迎留言^_^。4 X- q* Q6 T# @6 M2 m' t
+ t0 ]2 Q* j! f1 G
: G2 P0 j J& W6 n/ F- `
4 f3 Y K7 {) k$ k D8 p0 e r3 P% K) y7 |, t6 }4 U
|