0 O9 X! ?- r4 v M/ p/ t& A9 f: E" G9 M! S& a) S
9 ]# F4 Q% l( j: P/ `
前言
) x% D$ ~0 y. r% P. P3 U+ l5 Z
4 f0 l+ ~* S* R1 x% t& {Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
2 b+ [$ y& @. a1 r C: \tar
3 d# k" p* R0 Y3 _" O% d9 R7 h) i
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
* Y7 Y b7 \+ w. t Z涉及参数说明:: W! U4 \9 L8 \
-c 建立新的压缩文件; R8 y4 t+ ?0 h" H0 V
-r 添加文件到已经压缩的文件# p& a; ]6 R& M: ~" E: C. D9 y- E
-u 添加改变了和现有的文件到已经存在的压缩文件
( F) w( G) [* T- d' s1 l-x 从压缩的文件中提取文件% d& F( j$ V5 a2 \" a6 E
-t 显示压缩文件的内容6 H. C( m w% I8 A6 w e7 ^7 Q
-z 支持gzip解压文件
3 n0 i( h/ g8 r' w% D-j 支持bzip2解压文件
* s1 a) ~$ J1 I6 c f-v 显示操作过程3 j6 n, c! F$ K" D
-k 保留源有文件不覆盖
7 X7 U# x6 c" j# Z- l-C 切换到指定目录6 u n' W/ v6 ]$ d4 _% n2 P
-f 指定压缩文件
0 q% ^) z8 M; i# b+ L ~* V) O" O, ^1 `2 z% d& Z4 n
--delete 删除包中文件
0 v2 z, t/ W. B. X--strip-components 去除目录
2 Q. _. Y0 d! F- y- o2 t/ J+ f3 q--add-file 向包中添加文件
) Y$ @; T1 U! w8 i压缩
$ ]% W( U5 M4 P2 K1 `( i+ F( ?# L9 j' i) F* O+ d
归档tar包,不压缩
# b1 g% T. F5 H7 d! `4 G
5 T" g$ \; U" O9 b: [0 Utar -cvf test.tar test1.log test2.log #归档多个文件$ l' N9 J1 E; @ s) ?4 p0 i' d. g
tar -cvf test.tar test/* #归档test目录下所有文件" ]" m' p; _6 h) s% n3 ^
tar -cvf test.tar *.log #归档所有以.log结尾的文件 % e i( ?2 P9 f& j
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
* N# a, E: F$ K) v( v" O归档并压缩为tar.gz或tar.bz2
) O V; y/ m) h
* ~% C6 g$ y+ {$ i* \; S" a这种方式打包对文件进行了压缩:
. L# ^4 R5 J' v9 h: n( l6 {( dtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
1 ]9 _! {; o5 L3 K" n: r0 @tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
" W0 {- B- b- O) f, Z4 D, z查看压缩包中的文件2 q# k' `/ J% t: z
' M5 ^8 b+ @; U2 C5 F! {
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
) \; H! O3 P! ], Q5 ]7 ^3 Ptar -tvf test.tar #可查看test包中有哪些文件/ a8 |* I) m7 Y/ `/ l5 v' K- O) H
打包后删除源文件7 g5 F) w' r" E6 G& i
& x& P# s7 J1 k1 G" I有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
& [, U* s+ i7 M5 j& J, A& a+ H9 qtar -zcvf test.tar.gz test.log --remove-files
0 T- }' N* W) v打包除指定目录或文件以外的文件
$ }- Q# ?7 f6 z: q, W- g7 J( J+ U( ?3 e4 v
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:$ V. ^8 S; ]2 w( e) |9 x8 S
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件 z) G; k' P: S0 B/ D1 H
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
+ i+ c8 {/ q! C9 A z向压缩包中更新文件4 q1 f& ~. g% l1 Q% Z
2 T1 P' r, D: F
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:: x. b' I! x d4 A" j1 d
tar -tf test.tar --add-file=test #只针对tar包# y" [: p c% {6 a" P8 {
向tar包中增加文件
( h. E+ e' D+ Y! h4 m$ Y% w% D; F' T- x3 x" \* x
向tar包中增加文件可使用-r参数:
" j0 s* G8 H% W7 `- w. z, F4 S! ]# Vtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包. X9 X: l$ N9 [7 _9 C% X, n. ^
删除压缩包中的文件
+ T P T3 u; X4 G2 P
2 S: s4 \& i8 g, w Q# w在不解压的情况下,可使用--delete选项删除包中的文件:
# W+ r3 N" P+ Y/ v. Atar --delete -f test.tar test1 #从test.tar中删除test1文件, [! P! Z" v) j' p
解压( l6 y' J' r7 K; s
9 ]; @! n, M8 |7 I8 K6 ?
解压tar.gz和tar包到当前目录
/ t; |3 o" J! T" c! j! e( _% H& l( T: l6 F
tar -xvf test.tar.gz- M$ }, T! B ?* c
tar -xvf test.tar
* i3 I0 S; K" ~, J4 w解压到指定目录
3 p# [0 m9 X% n P+ n( }2 Z1 `7 S* K6 ?9 w0 k
tar -xvf test.tar.gz -C dir
( g& I9 Y! Q/ j# t: N; T8 O9 ktar -xvf test.tar -C dir
" ]6 x. K6 O2 r! d' c. u解压包中指定的文件
+ b R( D3 }+ ^0 b: }! \4 \. @. P X" }0 t) b6 @
例如test.tar.gz包中文件情况如下:
3 k- \9 |# u0 ]- S+ o1.txt! I X7 H4 y* S8 r" e
log/
# I5 _- X- z+ y3 A- s/ p4 ulog/1.log
. o5 C+ S3 M( w) nlog/2.log$ u0 V6 @* h$ N6 P8 W
log/2.log6 T3 G T1 ]7 ]8 |4 A
log/4.log& ~3 @5 s9 [6 q3 {) C8 {
log/5.log
" S/ j; V( R1 I0 W6 j) J( s$ v B如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
$ g6 V( f5 }! O+ n8 j! W# L. ltar -xvf test.tar.gz log/1.log
4 V3 [1 [7 R6 Z% R4 R% ^8 K, rtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录! r1 d3 s( j* [6 C# A& M
解压时去掉目录结构
! B+ ` T0 ~1 ^* a% a# ?) n& p: w3 L6 m f( Z7 w
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):- |& y$ p+ i& j( G; ~& \; I
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录: M% w5 o, |* g W$ [4 n
解压时不覆盖原文件, z5 h5 B) _ G
/ |% r6 E# C7 D5 [7 y% S; u) p, n当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):( L: ?8 s% X4 v) Z
tar -xvkf test.tar.gz) |) D' h/ K1 z4 F! T% q# P7 G
特别提醒
$ ~+ m; U5 ~' f1 q/ S/ j
, f4 G" u+ [/ ]( V前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。' W( E* Y M* E- H- h* O
zip/unzip L1 n3 f$ A4 v% Z
! O3 H3 `9 A6 j$ Y( \zip和unzip命令主要用于处理zip包。0 A$ [+ |6 d& H/ o( T. @
压缩
/ x: j5 d& _5 d6 n* j, Z( f: y- J9 D! A, O( z: v2 ~/ N+ D, v
涉及参数说明:" r9 ~) F( P) |4 }" b* ^: ^0 k) g
-d 从压缩文件内删除指定的文件。
" x# Z, T+ K7 ]( L5 y$ Y/ T. |-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
2 R# }1 Z- j! o4 ^) t-j 只保存文件名称及其内容,而不存放任何目录名称。
6 j5 g! t* x1 i) o, r8 D-r 递归处理,将指定目录下的所有文件和子目录一并处理。
) G8 d$ J! a! k-u 更换较新的文件到压缩文件内。1 E) C* e, \7 P3 b I7 X+ P9 c
-v 显示指令执行过程或显示版本信息。/ I3 F% c; J' R3 V e) z
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。6 p+ f( r7 F8 o& a% B6 g
- <压缩效率> 压缩效率是一个介于1-9的数值。
) v3 P) o8 A$ u1 N. C压缩文件
/ [; s1 [! Z. J; d2 [. B* |0 ?! b2 G o5 B7 @1 h8 V
zip -r test.zip test/ #打包test目录下的文件! n! f1 g1 O" p" H3 I8 b
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录0 F# h, R/ F# _$ r8 Y. g8 W
指定压缩率打包文件
7 w, t$ u' I& Z+ x! O; D b+ k
3 H! t1 E0 X R$ ~1 Rzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
( I1 ?5 t9 E+ c8 n. ]打包符号链接文件1 z: ^$ ~4 ~4 y2 r: D1 [& I
- e* g* q) J3 v
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:2 H) A; Z+ u( ~3 @7 h
zip -ry test.zip test
6 @/ k4 ?& U9 x1 p" F向压缩包中增加或更新文件2 d) I7 ~7 f: K$ g
% m) K w- v+ A) [( S
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
$ m. g* H2 P- W5 F; e: z4 gzip -u test.zip test2 #向test.zip 包中增加test2文件# O4 d% T) T8 q3 X0 r$ Y
压缩时加密
" g( C8 ?/ S/ C: V, ]2 L: H% A! s; B1 ]" k
压缩时如果需要对压缩包进行加密,可使用-P参数:1 r0 C+ z( ? F( F* _1 c
zip -r test.zip test1 test -P 66666 #使用密码66666加密
( E" t2 E5 b& ^, m( i2 v7 P删除压缩包的特定文件
1 _% A; Y4 O. e1 d; P# m- W9 w1 S" Y( d I$ t( N
zip -d test.zip test #删除test.zip包中的test文件! a) p0 Y" @" F" b- s, ]- ?8 y
解压- v$ c% ~: M: n6 t
" x8 \5 s+ Z% n8 B
涉及参数说明:
& f& i7 \6 V# m: p7 c5 C-l 显示压缩文件内所包含的文件4 F3 X3 f% H: ]
-j 只保存文件名称及其内容,而不存放任何目录名称。( t1 T/ L% R- g3 w, H9 w
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该* f# \7 J! S4 o
-v 显示指令执行过程或显示版本信息。
% S6 g/ h7 }5 _7 l& h* {5 J' {' |-d 指定解压目录,目录不存在会创建( V Y; s, u. B
查看压缩包中的文件信息+ S' Y0 S) ^4 Q) r/ U; r5 T6 p
7 _4 }8 I, w! W; R! c1 `
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
6 J+ \* R3 m8 n$ z8 Yunzip -v test.zip #查看更多信息,例如crc校验信息等
: Q& d- G; {" O* _ a P% P( |解压压缩包8 m9 u' ~. P& |
0 u. \+ [6 k2 V" H8 t9 G
unzip -o test.zip -d dir #讲test.zip解压到dir目录
# ^% K6 o3 H4 H- D解压包中指定的文件 w" K2 W: Z* y6 [+ |$ g( v
3 S- U* I: }) h" w8 k: y! ?! m
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法: M0 a' u6 V4 t0 z8 U
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
# _2 p0 E/ d' v- ^. Y: @ zunzip -o tet.zip "*.log" -d dir #解压包中所有的log文件$ z( m3 t4 v' ^
解压时去掉目录结构
% z' e. x7 V; M4 O4 F. P( D' N5 b2 _! \6 r" Y' [7 |+ P
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
7 {; A1 F- }& b0 ~- r r# p7 J7 d) Azip -oj test.zip -d ./temp 2 h& m! ~2 K3 w/ M0 {6 g v
解压jar包
, v& t. F) N) i
( j3 _9 B* T* C, D0 O; u7 Tjar包是java归档包,但同样可用unzip解压查看里面的文件:
9 j8 v. t! E W b. y" l9 a9 ^unzip -o java.jar -d dir
) J, T/ Z3 H8 i4 ogzip- K2 b" W0 L3 c3 Q
0 h+ b2 G0 X# x6 _6 N
涉及参数说明:
1 Q. h- v7 [) K/ y2 `1 N1 `-k 保留源文件
8 C/ p5 H) t3 }, z1 l-d 解开压缩文件9 A6 O! ]# s; W$ ?* [
-r 递归处理,将指定目录下的所有文件及子目录一并处理
4 n8 g- v% q% @-v 显示指令执行过程' a* q. n+ l4 ]! q& R
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
7 p% k0 ?% W0 c; P& v' Zgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
% N+ W$ D8 t! Z: }6 `3 pgzip -rkv ./* 递归压缩
0 {" T, G1 X5 \解压也很简单:
5 j2 R5 Q. C3 {. b8 igzip -dv test.gz
' D5 o) W+ Z9 X; T8 U+ Z/ cbzip2
$ q4 ?6 D8 F- i% n n. v6 p% h/ u
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
2 E& w* K9 i4 u- Z- X+ l7 o+ f$ C) sbzip2 -zk test #压缩test文件! w) n7 c; R6 b' k& R
bzip2 -dk test.bz2 #解压
( n6 o( ]& u" i E6 |1 s/ P2 prar/unrar
+ J, _1 T$ C7 J }7 `) V5 d( I) s2 X; K- |7 q p
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:+ S* T8 N' ~) |
rar a test.tar test #将test文件压缩为test.tar* w6 ?$ N* z% w5 B$ {# R* q
rar e test.rar #解压test.tar
% K$ i& q, T/ @7 W1 k& kunrar x test.rar #解压test.tar
6 i$ p0 ]0 z7 {4 Y; i& }压缩率比较
: b$ |. Z9 r+ ^" y& V
7 `2 b1 g R& ~压缩率一般来说:
: [ Q8 ]2 [3 r7 Ltar.bz2>tar.gz>zip>tar
6 ]( u, ]% f' ]( E1 w4 i压缩率越高,压缩以及解压的时间也就越长。: V! q0 v+ n2 t7 W3 |! h* l
总结! r5 x7 n9 D m8 N
! m; M9 t% |# t
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
7 O( f }& w4 r: x& v; Q有任何补充或建议,欢迎留言^_^。
8 V( y7 O ^# k& ` t$ h6 i! h0 j/ `! h% K& D+ x
; a! B' |) I9 D/ b, X# q+ Z( I+ E5 H- ^6 c9 ?3 S, q1 Z
, i- S& |( ~3 d! u e! w3 ]3 _
|