; n3 }: _5 r% @- A
* g3 l3 ^% T# p: c8 J. X# n8 U( w4 P7 x
前言7 D% C( {5 n3 S; K
$ C6 ]6 }7 l' c8 O( lLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
1 m( o. D# o$ t1 T' ctar
& F9 L8 F+ I/ q5 f3 ?' l. q5 ]! f/ k8 m$ O$ N5 s6 I( ?9 a
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
\( Q+ w; z' P8 u5 @4 I9 c+ c涉及参数说明:
3 m- U# A5 M# h: H3 L$ R8 B0 u-c 建立新的压缩文件+ W' [: u0 @: d* R, f$ [ g
-r 添加文件到已经压缩的文件# y8 k# H8 R2 |! k, ]0 j
-u 添加改变了和现有的文件到已经存在的压缩文件
4 e0 d4 X) \7 {) \# B8 D2 `-x 从压缩的文件中提取文件/ `( a3 Y3 X2 r/ ^* A" \
-t 显示压缩文件的内容7 |' \! ^& s0 N4 o" M, k0 ^
-z 支持gzip解压文件
4 ~4 v' r C/ R1 k7 H-j 支持bzip2解压文件( U+ A1 |; \9 C: D+ p
-v 显示操作过程
' w& ?: J& n( Q( h' B% u k-k 保留源有文件不覆盖4 {; c" E4 ?. m! @( J+ R
-C 切换到指定目录
m" N! C5 ~3 p7 k% w) _+ b7 m5 \-f 指定压缩文件
7 H0 X/ a; D6 [# s! w8 ?. g* G, I8 q7 H: q8 U
--delete 删除包中文件/ |3 B, g4 ^' K' L$ ]5 k2 t- t
--strip-components 去除目录 A1 l/ w# _0 r' Y1 P
--add-file 向包中添加文件# x, X2 @; Z7 j) C3 |2 ?2 K. m) F8 W
压缩8 k9 {: ]- P1 I. N0 ?
# c, T }" [; ?% c+ q
归档tar包,不压缩& c' c; i3 C" a
, j2 }, X) Y5 j! V" X+ i R2 r
tar -cvf test.tar test1.log test2.log #归档多个文件
2 O7 y! ?/ c" U+ g) n" k" Xtar -cvf test.tar test/* #归档test目录下所有文件$ I& H2 }1 p6 }" B
tar -cvf test.tar *.log #归档所有以.log结尾的文件 ; k+ Z* g3 k6 u6 U5 J7 S
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
. ?' C+ c" f! X! i: M3 m+ ^+ _' M归档并压缩为tar.gz或tar.bz2/ ?' v% ~( \ k, P
( v% K3 u; S( v, F- h5 C* Q& A! H! p3 N
这种方式打包对文件进行了压缩:
' g: E( Y% t1 O, I: btar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩5 C6 L# Z" w3 \7 d" [2 n0 S
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
+ O: }1 j O4 \7 ]2 r- c( V+ N查看压缩包中的文件- R) ^! ^$ q2 s
0 |# x3 h6 e) k' O& E4 u
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
* F* @* d% q9 X+ H* ?tar -tvf test.tar #可查看test包中有哪些文件
! q; f3 k& Z# f7 |/ h, U, H9 z+ D$ p打包后删除源文件
0 s- e5 c: ]4 l/ \1 ^$ m: g3 T% i
2 o5 q1 t( h6 S$ t- q有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
# H1 t5 T) \. d; L% [1 vtar -zcvf test.tar.gz test.log --remove-files + a9 u: S1 d# h- z( | {: Z
打包除指定目录或文件以外的文件
2 A% ~' P6 Z3 K+ J7 F0 l8 F0 S2 ]" K- k& j* f7 {2 D6 V/ U
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
# m* b! u/ g3 F& B- F7 Ctar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
- l! U7 ~1 w/ T6 H/ P这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。' E) V: {/ y7 Y' @9 i) E
向压缩包中更新文件
" W) t3 ~& E) v' V& b/ t9 o' R# A, O! |6 x( F( @
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
+ }' X2 g; t1 M( ttar -tf test.tar --add-file=test #只针对tar包
" }# @. r' n* e( ?$ u向tar包中增加文件
+ \* ?' ?0 T& a8 F/ U
8 u& T0 ?) P+ E4 [) g+ z向tar包中增加文件可使用-r参数:
* g0 i8 \5 W6 g4 ltar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包: G4 i* O+ _/ m8 E% u
删除压缩包中的文件
% B, z1 {2 f& U( g y* e
1 n$ S" Y% B3 X1 A$ {- F" @在不解压的情况下,可使用--delete选项删除包中的文件:4 c: D( j" ?; q' F
tar --delete -f test.tar test1 #从test.tar中删除test1文件1 k/ U3 I# ]4 V$ r% @
解压
2 }! ^5 g' B$ R4 {) U# s) t* s3 P; c# P) ] P! v/ @
解压tar.gz和tar包到当前目录: w# `- j( n( [
& g- f+ c* O8 \5 I' y3 \
tar -xvf test.tar.gz
7 |$ o/ q& }- S9 btar -xvf test.tar 7 T7 ~3 i$ L9 \6 W
解压到指定目录
1 a; E* @0 n3 X. E2 X
$ v$ ?- W1 }0 ttar -xvf test.tar.gz -C dir
: b+ D3 p; b7 r6 h; n- q& W1 _/ V" Dtar -xvf test.tar -C dir. r* ? r4 }5 C( R0 J. }
解压包中指定的文件
; |0 J& l, Q4 f) |' c* h h8 E" F: _6 s9 N# e4 U/ p
例如test.tar.gz包中文件情况如下:% i/ Y5 ]7 \# g7 r$ j
1.txt
$ U- H0 w" e1 rlog/* O# c$ K4 d: U i5 y
log/1.log J8 `1 B. _; ?" {" w [) ^' h
log/2.log0 d& @4 B9 W; O+ q- T" a) P; S& i
log/2.log8 `' {: a& ]0 X" @2 A9 W! D- W
log/4.log* v+ ?' g% Q5 [; B( ^& w6 K
log/5.log; D: F5 R2 v6 w0 I5 G. ?5 u
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
4 B6 [0 _9 `& G) ]* A6 @8 mtar -xvf test.tar.gz log/1.log
; J# W% d# g! B- t# ytar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
; G3 _; G8 d2 `# X9 r, W解压时去掉目录结构% r/ y# C, t5 g" z7 B+ ?; r
; @3 k* [7 d" q' s' ]# J8 R2 X
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):, M" N$ {3 M+ e4 ?* Y/ L' @
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录/ }' Q6 |2 H7 `% D( A8 z
解压时不覆盖原文件5 w* k0 y" R f3 ^+ n8 F. K
' v/ ] k1 [/ K. z0 p
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
) `+ J* G k* ?1 L/ H% ^9 \, ?6 atar -xvkf test.tar.gz
$ v. ]* D/ L5 V6 _/ ^$ i2 D特别提醒
7 ~8 R; y4 X- W u1 Z% S" L1 ~' g4 x2 F, i6 Q2 f$ t
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。' ]3 z2 A. k; x1 e0 v% W" Y. \4 c \
zip/unzip
( T& o( T0 w2 d# e+ t9 b+ C; k8 t* L- v2 L/ F7 [/ I1 e+ G
zip和unzip命令主要用于处理zip包。
5 s6 U4 ^: t. B压缩
( }! d3 G! a1 ^8 X6 o
7 _! D9 s6 f( }2 E( f涉及参数说明:2 _* y6 ~2 b$ v \( q
-d 从压缩文件内删除指定的文件。! B& y+ i2 B7 z: X0 {3 O
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。7 M t1 a* K) _
-j 只保存文件名称及其内容,而不存放任何目录名称。
i+ R) c4 j4 A-r 递归处理,将指定目录下的所有文件和子目录一并处理。' z( `% H8 Y! n* n" q/ R$ R
-u 更换较新的文件到压缩文件内。
7 k, m* U! S! g/ I$ @. z-v 显示指令执行过程或显示版本信息。% k4 i& ?/ m; ^4 T+ A8 x$ Z
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。5 \2 j e" v4 O& M9 B! a9 x
- <压缩效率> 压缩效率是一个介于1-9的数值。0 }+ K- S5 R0 C0 B* {, s" s! l
压缩文件" e; [( @' K# X% ~( B! d
, {8 Q; t5 _/ [' ^* p" X4 |
zip -r test.zip test/ #打包test目录下的文件) O2 g0 p3 |) i, I. G
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
. s& L# h1 B& W2 E }0 D指定压缩率打包文件& y, x! p$ i3 c0 ^$ f# R
: X. |. r$ g1 P3 \ Z$ x5 s
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
) `- s" E( Z( D( D! e) B# H+ U2 g打包符号链接文件
* @+ |8 r0 ~+ x# Q4 ^
' U4 G& t; J4 b, A$ n前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:7 ?6 g. ^" w$ z3 D6 o
zip -ry test.zip test
7 _+ t) T3 _& X4 | P& }! l向压缩包中增加或更新文件
7 Z" `( C5 H; L# U! |( z. f" P4 x6 P
- J; ~: m5 A' C$ D4 u/ w1 |1 I有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:& s4 \ H* ~# v7 `. W
zip -u test.zip test2 #向test.zip 包中增加test2文件! Q8 Q4 x& O% J/ A2 A4 U
压缩时加密
) f% z3 I) h- v$ l1 I0 h* ?' C" o4 M/ O3 t' ^2 N( D+ V
压缩时如果需要对压缩包进行加密,可使用-P参数:
/ x) z' y$ l; I8 Ozip -r test.zip test1 test -P 66666 #使用密码66666加密! W/ r+ F2 D$ j
删除压缩包的特定文件
, n& g+ y) |( \5 [8 e* G9 v4 G) [0 P" K
zip -d test.zip test #删除test.zip包中的test文件
; Q; N- s/ x3 M, n解压
9 o2 U# z& k6 k# {
% j# l, n9 X: N, h* k7 f涉及参数说明:/ E5 G ]" k7 E0 |( g9 [
-l 显示压缩文件内所包含的文件% m- m, _, ?$ b+ K0 i# o
-j 只保存文件名称及其内容,而不存放任何目录名称。. p7 U$ e7 @# a8 e% z
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
; b; _0 t4 o, ^, y' ^4 @-v 显示指令执行过程或显示版本信息。
# j* C2 V; n) A% l-d 指定解压目录,目录不存在会创建
0 ~% z- r. |& V6 Z: k查看压缩包中的文件信息7 m# K$ [/ J: b% v9 f. J
; }% n& h2 c. q* A/ f- i4 Kunzip -l test.zip #可以看到压缩包中的文件名,日期等信息+ }" G$ \ q# g
unzip -v test.zip #查看更多信息,例如crc校验信息等/ K5 Q; P& k" O/ w
解压压缩包
- Z4 l1 M. t/ C: P) I2 i( b7 l8 p* h& N1 `5 ^
unzip -o test.zip -d dir #讲test.zip解压到dir目录# D Z" P9 T; d
解压包中指定的文件
3 g+ E1 ?' _6 r9 F+ y( F( P4 B1 T( _! E: `6 h9 U
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
% x5 u- G. h2 A- ]) u4 tunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录4 X7 O1 H. J* E6 u
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件
3 [) m0 `' e6 ?) z解压时去掉目录结构
9 U7 M2 h$ q( x! g
% A% q& I/ ?) q* ]6 d压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
6 K( l1 F" O2 c2 Qzip -oj test.zip -d ./temp
5 u+ O, J. R0 ]1 |0 U解压jar包2 R) P; x+ A* P \" R8 z
+ |; B, I; x8 c% _( N' Ujar包是java归档包,但同样可用unzip解压查看里面的文件:
9 |: K. v$ p5 p( ^ ^unzip -o java.jar -d dir u _1 ]0 e$ B. P4 @
gzip9 _1 _+ u+ Y8 f# [* E/ u! a
7 y% ^0 t' H R! T ?0 {
涉及参数说明: g& y" G- Y3 X4 ]9 R& G2 R6 A
-k 保留源文件
( B) N5 D" T9 x; K. t, b' q4 R-d 解开压缩文件2 [3 s0 [8 D4 Q7 m, v
-r 递归处理,将指定目录下的所有文件及子目录一并处理
+ _' e% r5 p& \( ~-v 显示指令执行过程8 C6 r& j, g7 K# A9 z/ D" b! {0 }
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:4 \9 O- K8 Q& V3 d! j
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
" [2 G, n1 r" r. T+ Mgzip -rkv ./* 递归压缩
, M& X$ Q5 L7 w) O解压也很简单:
/ o) W! X4 ]( E1 _' _gzip -dv test.gz
' h+ L. _( `& @% A E0 gbzip2
X$ o0 k+ @. o& U" a6 T5 z& I, H# f# P
* B0 L; L3 N! `4 O$ F4 Mtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:$ W' j A; O7 {/ I
bzip2 -zk test #压缩test文件
. \; i2 F! v3 O/ J3 O: abzip2 -dk test.bz2 #解压$ z6 j: F, A5 e7 ^! j2 n
rar/unrar
( I) C6 E' J: ~
& [" H8 x( o2 f3 w* [' O8 m, ^rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
9 k$ ]. H: e- k% |3 b& Wrar a test.tar test #将test文件压缩为test.tar
9 t. L$ @2 r. n! \* r# hrar e test.rar #解压test.tar
3 T# p$ K" A3 P* j6 @- iunrar x test.rar #解压test.tar
1 B ?+ t. @! N& ^压缩率比较8 t7 o3 [4 X$ Y9 [' Y7 J; n& W) i
& v, o' ]6 W/ K9 b- S1 M9 f压缩率一般来说:& R" s$ p( V# N& P. l( H& o0 W9 X
tar.bz2>tar.gz>zip>tar
* o( @, }5 ]% f M$ {5 h* t压缩率越高,压缩以及解压的时间也就越长。
2 N* W0 P- T: z, o# M: ^总结+ N7 \( ~% U7 \+ K3 b G
0 a& K+ d) }( G' e3 l% T5 k4 s: I) R对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
0 j( U! j9 O- \$ `& W有任何补充或建议,欢迎留言^_^。: ?7 f/ x- S8 }+ q
" m2 T0 \7 Y' `8 P. g1 G, |% a
. `6 j9 p' C# l; o1 H0 J& X; q: F7 ?4 W# d* |
5 T" W8 K& g; S5 F, Z
|