+ K1 F! k" T( Q n
! J2 t8 u# i. {/ E: j1 P# |2 N, r% i. w- E3 H# p% \6 H
前言
# B8 Z. d. F& ~; y, q* z) `7 j
6 ~8 M$ k9 y1 t; dLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
# y& U7 ~% e; g9 h& |9 ftar/ t- c" H% {* \' e
3 c. [/ p3 ]' @$ d
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
- @% y$ u% y; J* D$ c! d: ?涉及参数说明:- D$ T3 A5 S7 \ o( Q
-c 建立新的压缩文件
! _6 J) @3 O% n3 b) q-r 添加文件到已经压缩的文件
e3 A4 m" D O8 E1 Y2 U-u 添加改变了和现有的文件到已经存在的压缩文件$ S( A9 K, B; ^; n
-x 从压缩的文件中提取文件6 K K0 V, `; v) [* n, `
-t 显示压缩文件的内容
: }% N7 `" k5 O8 I-z 支持gzip解压文件
$ Q3 p& W+ I! k% R-j 支持bzip2解压文件- n$ y+ ^: |4 k- J R( b
-v 显示操作过程) `; A, B$ k7 C6 T' |
-k 保留源有文件不覆盖* R& v1 T# Y" i1 }: V& f! O6 o
-C 切换到指定目录
( D, _. K D& o6 [& S; j-f 指定压缩文件
$ E+ A) y" Z0 z7 M( u* M) A* H9 ?1 p# D/ Y0 ^
--delete 删除包中文件5 O! p2 W: R$ R) R8 W- o
--strip-components 去除目录4 _% m; Y; ?' f0 B
--add-file 向包中添加文件
7 q9 ^8 r4 O3 w4 \: X压缩( t" x' M3 f% p) [1 f: ?
( p* z( p0 V" b I$ u9 {+ N
归档tar包,不压缩
1 k y0 G6 o( {, D/ v7 S- W7 ]% I' ?3 O. a8 A: R/ L3 k& A
tar -cvf test.tar test1.log test2.log #归档多个文件! R' b) T3 a i4 x O
tar -cvf test.tar test/* #归档test目录下所有文件
/ y9 T4 _2 ^2 \+ V1 L8 Xtar -cvf test.tar *.log #归档所有以.log结尾的文件 - {) g+ B4 Z5 U5 W
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
. V$ O" t3 {: s归档并压缩为tar.gz或tar.bz2
) T K7 |9 S$ q2 H8 Z2 J) M' g/ a( N& [ }5 p9 n# P
这种方式打包对文件进行了压缩:
* N& H% p: r" I- atar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
( c i2 Y E9 y" {! Atar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
+ o7 x! X4 H8 x查看压缩包中的文件& n* \( T8 \; p% p! H: F' H
( B( m$ m+ y* s# q5 x! v+ d如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
J; J' T7 V" V' Ftar -tvf test.tar #可查看test包中有哪些文件
' O6 E- j' W2 d! J打包后删除源文件
9 o0 Y7 O9 J" D
' Y f# H" I. O, f- z ~4 Z有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:2 p6 U8 M2 `; x5 g( ^) D3 k
tar -zcvf test.tar.gz test.log --remove-files , h0 ^$ @7 \" ` S) g1 q. J
打包除指定目录或文件以外的文件) t" E2 H% @- F+ b
3 W F* ^, D5 }! L# o对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
+ P' l0 z% G: M4 k. n! W. Ztar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件 O+ m6 V+ V6 z8 }
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。* i' f4 m9 Y# l4 S5 u
向压缩包中更新文件0 V% a0 P! g3 P+ l4 t8 K* z! h
2 d7 x( q- j8 m J1 W$ |/ [例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:. M0 R3 K! K6 {5 I
tar -tf test.tar --add-file=test #只针对tar包
* ?+ d6 Z: P0 [1 ~/ [. H3 {向tar包中增加文件. c; ^ S7 z! a! \7 x
' U: ^7 N8 R0 Y- m向tar包中增加文件可使用-r参数: d% }* N- D: e! ?, t# }
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包& Q2 T j4 x- C1 D+ u2 @
删除压缩包中的文件
" ]0 J- C {! d a& R/ ]* {5 M9 f9 j8 R$ T1 F; O5 R
在不解压的情况下,可使用--delete选项删除包中的文件:) P0 e' Z* H. ]) f* d/ J
tar --delete -f test.tar test1 #从test.tar中删除test1文件2 w6 Y# z* ^; P0 P! A
解压
p' W% O; b. O9 ]2 B
6 G+ y! Y# B: ~; \' V, t解压tar.gz和tar包到当前目录
6 Z5 r6 a: }9 _" ~$ O4 l, p4 d" A5 k/ W# Q7 z5 B6 E
tar -xvf test.tar.gz
! X4 W- u8 F7 o) I" |; t) C, r: ttar -xvf test.tar / e3 o! Q' m' o5 e' t) T
解压到指定目录
5 ?/ o% Q: i2 ]% }+ n' L6 o2 y5 o6 ]5 }( v( N
tar -xvf test.tar.gz -C dir
4 ?6 Q/ K | o5 n# dtar -xvf test.tar -C dir
! i' H& {' O; @; J4 h解压包中指定的文件9 U7 x' w1 U7 C, m. N
2 s5 E/ f) c. C( f. F, a6 q' J
例如test.tar.gz包中文件情况如下:
* l$ U1 d) A3 w$ B8 S" c1.txt
: W5 _& K0 ?1 f8 I: U6 `0 Alog/4 M! a( I% [; L- p3 w
log/1.log( j2 a% |+ e+ H7 v# n0 m& i1 j
log/2.log
3 `0 T0 x9 [" m) ^3 i& O1 nlog/2.log
; ]1 D/ o: G! A% o0 f3 ~- U$ nlog/4.log
2 ?* h5 p7 y( S% |log/5.log: [! f4 f* C5 l' ^9 g2 u' R- c
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:" I8 b& f/ H i9 ~% N" L
tar -xvf test.tar.gz log/1.log
/ J- _+ E% r5 g7 c# Ttar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录; o6 L- e% T- M
解压时去掉目录结构
( K+ z/ w" W( ^& ?7 R. D
" m8 H. g0 A8 ]6 u压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
( C" B8 H- S% Mtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
2 r" c. t8 @4 O" B2 Z" k* B解压时不覆盖原文件3 Y: ? e% e3 H$ m8 \
0 g. M6 t, w. a. q; O) f当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):6 |& ], j3 X- C3 b$ a9 R3 u
tar -xvkf test.tar.gz0 @/ S1 F* K* k* e5 D& c
特别提醒3 [! ^/ i$ D8 q
- Z% h& k, A$ Q前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
- M* b# D# A8 v3 O" e2 Tzip/unzip
. G, Y# a2 _4 F9 C4 x$ `. ~2 g. E! P8 |9 C0 E$ b& z
zip和unzip命令主要用于处理zip包。
3 O$ J( Y% J! X$ e. o7 A! k( x压缩
7 L$ I6 R: N' Z* }) `
" |3 ]; S* o6 i; G7 R5 E. L3 p( ~涉及参数说明:
$ y: r: ]6 N5 |$ @-d 从压缩文件内删除指定的文件。7 h2 {& E' Q1 U
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。' ?4 W+ {( {' x, W, K' e8 G
-j 只保存文件名称及其内容,而不存放任何目录名称。/ _ _- q# j7 O/ f& Q: _. P3 e
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
! S5 n) M2 ?8 \; D-u 更换较新的文件到压缩文件内。% Z" }- t! @7 H# K& r9 w
-v 显示指令执行过程或显示版本信息。+ a' c' A$ g c% i. {4 ^
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。' u' t6 d" N5 v1 A! H5 u
- <压缩效率> 压缩效率是一个介于1-9的数值。
6 A( o& a0 M7 J4 f4 Z8 H9 \2 ?压缩文件
# E6 `9 ]4 Y! Q' @" z) O9 u3 r+ y; o) o H
zip -r test.zip test/ #打包test目录下的文件+ @4 W* \0 j7 K! z- @
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录) i2 M' @9 ?3 x9 U; e
指定压缩率打包文件
2 z1 T) N& F2 E, _! B3 ]
3 j1 T4 R* h9 x. Z! ~zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
: p: F: `4 n( x @打包符号链接文件
8 W7 H9 m$ ]$ A. X. R7 g+ E( {* `* }9 n# |6 d# o9 d( V
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:& m7 a: U( i* c- G$ X
zip -ry test.zip test
5 x! }+ J3 G( O- y5 o9 j5 h4 w向压缩包中增加或更新文件4 d$ P4 I0 r2 I1 Q# @1 [
; n% |8 [2 U r" E8 ]+ s' P1 W
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
2 B2 R) @7 k" l$ X; W0 Azip -u test.zip test2 #向test.zip 包中增加test2文件
. u2 E/ M( P( [' V7 T压缩时加密7 M3 ]1 V3 j) @4 ?( Q
6 o6 ~$ I: V) `* y9 {压缩时如果需要对压缩包进行加密,可使用-P参数:
7 V# X: R; T3 Z& P# b' q8 L% bzip -r test.zip test1 test -P 66666 #使用密码66666加密( U& a. a$ ~* Z
删除压缩包的特定文件4 q7 {$ I( W5 S
9 H9 z- r; }% J' u! azip -d test.zip test #删除test.zip包中的test文件
3 o( j. U- u; {! n9 c; ~解压
7 P* W9 w* x0 @4 A- N- q5 y3 D/ V# ?0 ?- L' y9 g
涉及参数说明:
/ V% ?# A# Y, {1 T( c2 W/ j; }-l 显示压缩文件内所包含的文件
: U+ w$ L9 V& t# e5 k; g( ]-j 只保存文件名称及其内容,而不存放任何目录名称。% l9 Z# c7 I! K. X
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
4 p+ |( M3 ^. Y$ E( p6 e$ \7 o-v 显示指令执行过程或显示版本信息。5 D" x1 d" d+ H
-d 指定解压目录,目录不存在会创建* u" m4 X' a* _0 H. J3 {+ N- f( M/ V
查看压缩包中的文件信息* Z% r3 U+ ]9 ?. D& Z
1 Z8 s* _ f% C: ^8 Cunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
: j0 E: v' I$ w/ J) f- O/ Funzip -v test.zip #查看更多信息,例如crc校验信息等
% D" v [2 e3 z+ k P解压压缩包
1 S% K8 N. N3 ^. _1 {9 ^2 s; k! ]) L
# V6 _6 D( u, ]# uunzip -o test.zip -d dir #讲test.zip解压到dir目录
: U6 V& @7 i8 [8 m) A3 u" a解压包中指定的文件
, m6 M8 r; I( h% W, A
, ?' D4 S$ T3 F$ T; ]' ~4 o如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
: G* V, O5 e0 y4 z" O2 P) V2 Punzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录1 G% m4 N# `7 b! r
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件) Y% U* n0 d2 ~) e! j8 `" C9 S' h5 @
解压时去掉目录结构
2 s1 `& \$ A3 ]( s
3 L. ~& Y/ \0 {9 k( `: X( k压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:# T8 \8 {8 `' U, }- \& O2 Q
zip -oj test.zip -d ./temp K% x2 E1 p. C. }. p" ^
解压jar包7 |% r! y5 }( D4 v& e- r
8 ^& t% {6 y c+ ]jar包是java归档包,但同样可用unzip解压查看里面的文件:$ n3 T2 w+ ~* Y8 a- q
unzip -o java.jar -d dir( ]3 E# d4 A6 j; m" V. f: p
gzip* j7 Z* H# D% C d9 \
% Q0 n1 Q1 |2 u4 s, s6 a l涉及参数说明:' U% f4 x8 @' F6 k7 F ?( F
-k 保留源文件) x9 F+ l7 G9 n5 T
-d 解开压缩文件
" K- n! D/ ?" c+ ^3 @-r 递归处理,将指定目录下的所有文件及子目录一并处理* Z C5 Q( H' u' U
-v 显示指令执行过程
. L$ {9 K: e5 L6 rtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
7 b& U& F; k/ N8 tgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
9 C! K4 s! o8 Ygzip -rkv ./* 递归压缩1 L, A( w* d& `+ Y
解压也很简单:2 g" B2 c$ u ?/ ]
gzip -dv test.gz
; Y4 s. K4 ^6 }bzip24 |6 D8 S, g; {+ Q: y/ c9 @
! V7 H3 M2 l9 w% Z% h5 ?, q0 |tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
2 O' [6 O/ e* R: {0 Q X: \bzip2 -zk test #压缩test文件
# A u% K; ~& T r W% f% [bzip2 -dk test.bz2 #解压9 j) ]/ y5 |7 F7 V. O4 y
rar/unrar- }( g% |# Q0 u1 p1 Z5 Y. i
5 O7 }$ y1 A7 k0 P- ~- Grar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:9 \. J+ ?$ ~! X) @$ j) A0 M* s
rar a test.tar test #将test文件压缩为test.tar5 j/ ~$ h$ K( U# w f4 T0 j
rar e test.rar #解压test.tar
) R; m- L1 B7 H5 i8 tunrar x test.rar #解压test.tar4 \6 P2 T2 T; } o$ f- S. a1 d; f3 ^* |
压缩率比较
! q' }+ O6 L+ y/ k. N+ n l1 f; }& N
压缩率一般来说:
2 c7 T- ~5 K, k" d0 y% b( Y* ]tar.bz2>tar.gz>zip>tar
* @1 Y" K5 `+ S* x: F% S4 |压缩率越高,压缩以及解压的时间也就越长。7 Q3 [8 A0 S' ~# p2 E! \
总结4 g9 ~- T Q' ?( j* f
4 u. b) z( `" E! ~+ s对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。) \5 H6 z9 ?& A& z R
有任何补充或建议,欢迎留言^_^。
3 n1 X O, U/ M" b( V3 U7 x/ B/ P3 A+ }
; ~% ~0 Q/ n m' p
+ Y4 |5 G' G) `# f% O* w
( {0 x# {/ X' A1 ~4 ]
|