* P5 A: B4 I1 @7 L- O
( _ E m0 N, |$ `; U& s
9 J4 f9 }- K+ \* T4 m1 m) ?( K% E
前言/ t7 ~0 B5 H4 [; q' R! k6 `5 D* n
8 _; v) _( l+ @% i" X. V m
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
) z2 R ]' W* \9 n' m6 l9 g5 [tar2 \3 P5 v0 y+ X# Z" b/ z+ u- G
. x6 f5 \- R9 N0 s# z2 w7 p& [* W
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
7 a; _# @" r" I$ s) [& y' g涉及参数说明:! J4 p |( X7 {: t
-c 建立新的压缩文件+ X4 R& u0 x A d$ e
-r 添加文件到已经压缩的文件" w B6 L% m) z; ?5 ?' L
-u 添加改变了和现有的文件到已经存在的压缩文件7 I L4 J R" y/ G4 u; F
-x 从压缩的文件中提取文件
1 ~0 Y/ l' @; |- k( ]4 k$ l-t 显示压缩文件的内容" ?6 f5 U) r; V1 b/ T) M3 H7 b3 Y
-z 支持gzip解压文件
; `* g! R( J$ o6 o9 V N-j 支持bzip2解压文件$ Y! i, U0 q! K" c
-v 显示操作过程8 m2 h9 g$ b: L8 _' K
-k 保留源有文件不覆盖0 S+ w1 s& d6 ~. b: ~
-C 切换到指定目录; m8 `; I* o* c/ w' f. @
-f 指定压缩文件
+ B5 r7 q" \+ C0 e
$ L1 A+ Q, [. K/ A0 A--delete 删除包中文件- t* F$ {+ N6 d' _0 `
--strip-components 去除目录; Z; Y6 u: I. | ?
--add-file 向包中添加文件! W8 A+ `7 G" z2 I6 Y9 ~: t6 k6 a
压缩* t4 {9 C* T: J3 j4 C
3 a. k, a0 q8 H0 r) t" `- O& \归档tar包,不压缩
& B; n* X4 O0 q% N0 O# l- M/ E- n+ ]
tar -cvf test.tar test1.log test2.log #归档多个文件2 K- w& L* o5 j, l. E
tar -cvf test.tar test/* #归档test目录下所有文件
& q7 b& t" C8 Y$ a* x6 G3 W% ptar -cvf test.tar *.log #归档所有以.log结尾的文件
p0 ]' D! q5 h* l$ ]由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。# w, N8 f5 ^9 L% D
归档并压缩为tar.gz或tar.bz2
+ u( x8 d- W2 ~6 n, s1 t7 d
8 E' A: h' \- p0 ]- |# G$ o* j这种方式打包对文件进行了压缩:
( O* Y& J0 A4 U6 Y) D6 ltar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩' Y) S" a5 O+ N
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
' r. E9 ]1 i+ [2 l% a查看压缩包中的文件. G$ A' I( w* ]
% P6 |8 D2 t0 T+ _. J
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
9 |( B8 v6 l, t% d& V; Wtar -tvf test.tar #可查看test包中有哪些文件
0 c8 _3 S' H1 j$ \, ^. a! B# m7 A打包后删除源文件
" ~% D$ s3 j3 D" W
) u' p- \0 s2 [1 a R5 v8 G有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
! g9 v0 A+ R0 e$ l' @tar -zcvf test.tar.gz test.log --remove-files
; c6 W* U& Q( O+ Y3 V5 K+ F9 R( w4 ^5 x打包除指定目录或文件以外的文件
' c: n( y1 g3 m1 _: A7 z! L
5 }' P/ w3 A9 b4 @% d7 w对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
3 l6 ^3 @! k9 S, Q5 {tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件9 e/ O: Q5 @ c' M
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
5 Z; G3 K+ E5 ~8 K- g' `7 D; @向压缩包中更新文件
0 |2 U$ X7 ~0 F! G, ?
) L) c& H& P$ h* U例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
1 i2 L) c( ~4 `tar -tf test.tar --add-file=test #只针对tar包
A3 X d# q# A% n7 S! s向tar包中增加文件3 @4 c" l5 v6 ~7 ]4 m
/ z) d# ^9 p) e0 [向tar包中增加文件可使用-r参数:
3 L E7 {3 C! K' B$ N( etar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包# @6 {. g! ^3 ], E# {/ L
删除压缩包中的文件+ X8 T" q' [4 |) J5 ~) i% O
' f0 w+ e: Q, B1 N4 u n在不解压的情况下,可使用--delete选项删除包中的文件:
^7 b: ?7 v/ {5 N; E7 |' [) M# ftar --delete -f test.tar test1 #从test.tar中删除test1文件 X6 \; d6 u5 m i
解压
/ F' A3 u; J# Y: r* h: v; Y9 E' b( J; o
解压tar.gz和tar包到当前目录
( G2 X* E, X |; k% s5 Q0 Q8 e
3 f" a4 C( [8 @# _) {tar -xvf test.tar.gz
0 z4 u9 S8 i- k& W4 s. W" j ctar -xvf test.tar
" V7 m. S" R }' C解压到指定目录
( ?3 z8 f0 B5 R% k% T% E' q
2 p9 n5 d5 Y/ o+ c l7 N3 ~. f, qtar -xvf test.tar.gz -C dir% F f0 e. t: V2 g; e! _. P
tar -xvf test.tar -C dir$ H% {; I/ I- j* q. ^
解压包中指定的文件
2 F6 U/ [6 e# n2 P- z/ v- N3 b, }4 w; ]# r* W& a+ D
例如test.tar.gz包中文件情况如下:
9 v. ]( r7 U1 T1.txt
1 K. N/ {. A" m& F. Olog/2 M5 V* Q0 a' w) \; B a( m" o5 F
log/1.log4 O; G/ _& p8 Y$ q! Y e
log/2.log8 l |' y" _+ v9 {) k1 H4 l: P8 {
log/2.log+ G+ U: U _. [# c2 z7 s% O
log/4.log" W0 ^- o% c y1 T# u! p8 E( }- E& i
log/5.log
3 C4 d% o' l: ~8 C如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
/ t6 m3 N1 n' U7 Htar -xvf test.tar.gz log/1.log1 p, c: b9 U) e; ^2 g
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
8 W" V2 `. Z: [* i解压时去掉目录结构4 I# z/ @' X6 R- f% M$ H# O
4 J- b" y( y6 p
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
3 ^0 V7 {; Y6 [" ?tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
9 Q9 r& f( a' B" r8 X q' A解压时不覆盖原文件: y! E6 Y7 r8 h* ~6 G. O
' z7 e& @! V* f# C& s+ T当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):* Y/ b; B7 E" P4 k- x# p8 u9 ?/ N
tar -xvkf test.tar.gz4 D, q, K3 S1 P" _- a1 c
特别提醒
& k$ t% s+ s$ h/ {# w8 O% R( n
$ Y0 Q# {/ b2 h/ A3 T- H前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
4 u5 t- M7 T3 u7 f5 ^7 j: S L8 R. uzip/unzip5 Q( ^. ^7 O; {! m5 |) L
/ J* L Z/ P% z2 V) `zip和unzip命令主要用于处理zip包。4 K9 ?& S& @7 d7 Q" {1 D) {
压缩" W& D2 m+ f0 ?; H# y& M' n3 {* v
, K8 P& n9 b, Z+ b) k c& Y涉及参数说明:2 k z6 j# u' S3 \
-d 从压缩文件内删除指定的文件。
* A% [7 `' s1 z. J- N-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
* s, R. G1 }6 N8 |8 b% X$ H-j 只保存文件名称及其内容,而不存放任何目录名称。! a: C0 B. E/ x5 J) r- G& h
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
+ g n/ O# h$ K-u 更换较新的文件到压缩文件内。9 [* ^9 D7 @! k
-v 显示指令执行过程或显示版本信息。
7 S% w) A5 ]; d3 c3 T4 h-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
- ^+ v5 j/ R% p `* }; k- <压缩效率> 压缩效率是一个介于1-9的数值。( N2 W2 c1 f% C0 y% q# v# U
压缩文件
( s8 m0 u! |1 j V: ^3 t5 k8 i# y R2 f5 {. T
zip -r test.zip test/ #打包test目录下的文件
0 b" t, R g; J! K$ X. kzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
. Y* f$ D* j O3 C) Q指定压缩率打包文件2 [, C7 x' \0 {5 o: n' K
8 J% [$ {! t- A1 [6 Czip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
" A3 B/ M' b( y9 L% N+ c打包符号链接文件4 Q, K) c# z; T9 `. B
: ~% \' ~2 m5 ?2 |前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:5 q/ h1 I _' J
zip -ry test.zip test
% @" B6 E6 W" ~+ y4 U向压缩包中增加或更新文件( i& p: T7 W) w3 |9 I2 S
' A: Z5 N; u' |& J, A3 P P0 `
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:) {0 h m, R- U) {2 B" |3 A
zip -u test.zip test2 #向test.zip 包中增加test2文件
4 v& J4 T: }4 v& p/ t压缩时加密. {' M, g; V9 |2 V
) S6 [# H7 u5 E. n压缩时如果需要对压缩包进行加密,可使用-P参数:
3 Y4 K: m, U1 G) h4 d3 xzip -r test.zip test1 test -P 66666 #使用密码66666加密 U# {# d; I! c
删除压缩包的特定文件
z' z. f* ]4 K& |- L2 {% h+ |# Z. M5 g% c; v8 ~5 I% G: Y9 k: q
zip -d test.zip test #删除test.zip包中的test文件
& y+ S# `! X5 M- A解压/ I' t6 l4 b' }- }2 ` l
% I( c3 |8 m/ s7 T7 c. i
涉及参数说明:5 E- `# {7 c/ B! C
-l 显示压缩文件内所包含的文件! h4 ^! f, M5 [! b8 \ h
-j 只保存文件名称及其内容,而不存放任何目录名称。/ \, t3 W J+ J0 Z7 y
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
% L6 w: ]9 m# D6 c2 J: B-v 显示指令执行过程或显示版本信息。
2 H0 m* H* S( O-d 指定解压目录,目录不存在会创建
) j0 f% @* W0 B5 E7 t8 ^查看压缩包中的文件信息; y! a/ O C9 W3 J
1 g# W9 q$ R: Z. y+ r/ w. Qunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
) L- H' N! n. P% gunzip -v test.zip #查看更多信息,例如crc校验信息等
+ c z. u% V& F* v解压压缩包. h% T0 v3 N9 k( t1 h- p
1 n) S7 @1 f- P# T( X) \
unzip -o test.zip -d dir #讲test.zip解压到dir目录
! g, q! ~: |) }7 f. ]3 @& K6 {9 W解压包中指定的文件
2 ?8 q! K8 _% c5 \
: d- _; Y8 W) u' b0 V S0 ~如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:; q* ^- u9 Y# S% O6 ]2 {- `. Q
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
5 H/ f' y$ w+ J! N2 h1 ounzip -o tet.zip "*.log" -d dir #解压包中所有的log文件. E( f K. c' L
解压时去掉目录结构" X& `& I, q) x" d, z5 U- \
( c( \2 |. n* A8 r" I, h* m
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:9 O. i' X6 f! k9 W
zip -oj test.zip -d ./temp " _4 \7 |( S' m5 A8 `
解压jar包# |' z) R: n4 T! t N" M
- C, ` A. ]: p& }" P( jjar包是java归档包,但同样可用unzip解压查看里面的文件:
' t3 T8 _2 R- K" X# Q* cunzip -o java.jar -d dir
" P) S9 m) p. e. m8 b& H9 \gzip: f% R7 {/ b# a" o
; h/ R$ M0 O( Z, g* ]2 V- T: d$ P涉及参数说明:
3 b; c4 h1 X" J- m) d L X-k 保留源文件
+ y/ T, L6 r) r5 Y5 O; p# t! s-d 解开压缩文件8 ]9 u" V3 Z+ h5 r' ?; l5 O; y
-r 递归处理,将指定目录下的所有文件及子目录一并处理
3 }7 I0 {- ^7 `# A( T-v 显示指令执行过程" i& i9 O1 [- l5 ~+ Y
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:5 Q+ Q. t( a# a+ J4 O
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
) A- B3 l0 C' A3 pgzip -rkv ./* 递归压缩$ ^- D8 p0 Z! @) t
解压也很简单:# O8 ~0 @8 L- w+ {& `2 q/ c" T) {
gzip -dv test.gz * L6 H |6 p- W3 K
bzip2: [9 A+ T& s2 c6 y
$ {( X5 ~* m) B$ Q: {, ]tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
6 |! p/ K5 p$ Q( r8 R% p4 \bzip2 -zk test #压缩test文件2 b; g8 k9 k9 l; @
bzip2 -dk test.bz2 #解压; ~3 `$ G, P( B1 C! j2 Q% Y8 }& ?
rar/unrar
* d" t. z1 G% @2 Y s3 Q9 d3 |0 }5 y( b! \
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
7 f$ x: r# G3 _& x( \rar a test.tar test #将test文件压缩为test.tar
, L, R1 B2 H3 E8 N! ?rar e test.rar #解压test.tar
! ?# m/ k9 ] }+ P3 Lunrar x test.rar #解压test.tar
1 y$ o/ w. [ s+ d8 `, |$ F9 N压缩率比较( R8 m. m0 b) S5 A: G+ Q
8 p/ }; d0 Z" ^6 @1 @压缩率一般来说:
, ~% M! B7 X) e8 Q& star.bz2>tar.gz>zip>tar t/ O6 @, W1 w
压缩率越高,压缩以及解压的时间也就越长。
* h! w1 i) N8 v$ Z3 i/ n总结
9 a1 L! D9 a6 [/ T5 K' ]; E! t# R [$ w# W( b K4 |
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
$ d! E, M, }8 S6 C v" p有任何补充或建议,欢迎留言^_^。
4 P+ }; j- U6 [; b& [9 l! a; v1 ~" q9 v1 S: _7 ]' O3 X
% e$ q( m. Z( A" o4 }
# C$ t( z3 |* ~2 z% H& V
. W7 n2 ?! Y2 ?# o
|