' h' G' Y ]5 n9 {
$ E3 C; ? e s1 `* e. q7 c' ^3 Q+ K: o5 Q# l
前言
( s [' V% r$ h
$ v, T M* v, o) s2 _Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。7 v8 t; c g5 W' B6 _( _) g; @7 U# \
tar d2 \; F h" h& t- h; u+ P8 J
7 }! z5 e6 K5 ctar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
0 b! @) m ?6 {! i: Z( u涉及参数说明:
6 |/ |# q% V Z# s-c 建立新的压缩文件& {( H7 o/ z+ ?# S+ i+ G3 F* r5 S
-r 添加文件到已经压缩的文件' X9 k) W% _& y$ k! p
-u 添加改变了和现有的文件到已经存在的压缩文件
4 ^! J! G. V; W6 b-x 从压缩的文件中提取文件
# `" `% n! ?; _# c-t 显示压缩文件的内容
1 L7 s6 V, p+ }+ X/ {-z 支持gzip解压文件
6 T: d! o* t# s$ {" w+ a j% ^-j 支持bzip2解压文件
6 V+ j3 u% @2 q) L1 {) Q9 v( k-v 显示操作过程& O& B# q s5 l7 y- N
-k 保留源有文件不覆盖
X6 e2 Z0 W$ F- W" X# V: [" ~ b-C 切换到指定目录2 U& j+ i3 ~3 r' a4 X$ l4 a
-f 指定压缩文件8 O" o; J; C5 l+ I0 t
) J; Z" U6 V: V, X; E
--delete 删除包中文件) _+ k+ h" `: p( l4 x: V# ?' k0 R: N
--strip-components 去除目录9 D- d3 c" [$ P# w5 W/ j
--add-file 向包中添加文件
) t6 Z0 m, }2 p3 `4 Y压缩 v7 J9 A6 t; ^; W" x
. }3 i5 r- C0 x, F, A3 Q归档tar包,不压缩
2 G7 C* A; `0 g* G$ H0 M0 `, s" R: B4 R& C/ i3 z# [0 ]
tar -cvf test.tar test1.log test2.log #归档多个文件
: C. O' i1 x1 Qtar -cvf test.tar test/* #归档test目录下所有文件
( p2 s( h" z3 O6 S4 G" \6 Vtar -cvf test.tar *.log #归档所有以.log结尾的文件 * F8 b% [4 {* E+ I" h8 c- D
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
1 i: T5 j4 e+ ?6 R4 p归档并压缩为tar.gz或tar.bz2; L) [7 r) k! J6 d
: w; i! m9 ~8 Y: v' ]! ?# n这种方式打包对文件进行了压缩:
$ R, ]- o( i5 Y; \tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩1 @5 N- v, r: W- U7 R% N: c/ k
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩* J3 ?& {! [) v2 h8 k! Z$ q" T
查看压缩包中的文件
2 V' j/ ?- |9 Q- Q/ f2 f8 D: O" v" H3 ]
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
- R3 K; Z- o C2 v8 C% P$ A# g. ttar -tvf test.tar #可查看test包中有哪些文件
+ R" v' m4 ~2 i打包后删除源文件
4 x: A0 M; g4 W0 f) a7 ?
# X( Y/ A* N; y( V4 V有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
5 b5 O8 f' z. v3 {$ Qtar -zcvf test.tar.gz test.log --remove-files 3 z1 c% {7 ?& s# G% o
打包除指定目录或文件以外的文件' Y8 r$ a4 f7 | e6 E; t9 S
0 p; X$ y& z' @( D9 d- P对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
+ \: f0 d3 ]: @4 q7 Y: k) E- u4 }tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
! m1 \, I! U& I( p4 |- L6 \( L- A这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。! Z2 W$ }7 @) m, M" e3 i0 G8 d0 a
向压缩包中更新文件
0 ^5 \* i) _/ n9 _( _' V3 N
0 ~( b: x, B3 U; m0 D例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:0 J) j4 N& P" m. w' F9 u
tar -tf test.tar --add-file=test #只针对tar包$ ?2 o4 Y$ Z4 \. u
向tar包中增加文件
* ]/ g" O* |1 [/ {& \9 d' ]$ K7 l f
, @( D# d. D9 Z( h* {+ z/ {& C: X. J: P/ D! W向tar包中增加文件可使用-r参数:
2 p3 m) f( d; `6 Ntar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
5 D7 K+ B x) ]2 i o, t" y9 i删除压缩包中的文件4 z1 f+ Z) \7 ]) ^8 f
4 j' h' x) l f: M/ [, k j在不解压的情况下,可使用--delete选项删除包中的文件:, o7 [5 _/ z9 l4 }% Q8 m
tar --delete -f test.tar test1 #从test.tar中删除test1文件
, N+ g( U; X* n( w& E5 Z7 Z解压+ `7 Q2 i! B: e5 `$ O+ ~
, M1 k/ P d6 ^* P
解压tar.gz和tar包到当前目录% W* M& W; }- W$ ?- I" Z# p
( W' K8 w: ?& i2 |, p/ C
tar -xvf test.tar.gz
6 Q1 a0 b: t/ s& W1 m* R- Z6 Ktar -xvf test.tar $ d" v& ]1 s0 T% G; M9 h
解压到指定目录
" d3 |5 g! {. g4 O5 {+ F4 s% c( k2 b' V& ?/ a- W' L
tar -xvf test.tar.gz -C dir
: w3 }/ ~% H. z% Wtar -xvf test.tar -C dir( y/ ^4 q: O1 T6 l
解压包中指定的文件# V6 i+ @5 R8 X& B" D/ {3 [: @
' Q" x; L0 P# _( O% N, V例如test.tar.gz包中文件情况如下:; }% |( i! v, T3 Q. s
1.txt
. p5 S k+ f0 _& {; H% ^' Jlog/* e, D9 v+ [3 l6 e
log/1.log
1 `( b+ l: C/ y5 o. N9 o; [* Nlog/2.log: H S' X. w6 h; [2 C* f: n
log/2.log |. v* K2 p* {: M4 Z4 c o2 R
log/4.log. c+ w7 c! L# ~
log/5.log
& c6 x# v% z& r- Z$ E! `9 C如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
7 K; G6 O) ]7 g% y1 Otar -xvf test.tar.gz log/1.log
% k% F+ a5 I: @! T% star -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
! o/ Z( v @" ]. r8 B解压时去掉目录结构& P0 }* P# M; u9 Z3 h8 L
7 H, t1 C! `% W% s压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):- c# {& s2 c, X7 S# N7 Y
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
# X+ p9 L$ g" G# J! A4 e6 Y9 H$ ?解压时不覆盖原文件
" x' G- e( k% i! |2 a$ H% I3 v% T. V# {- z6 u) p! v
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
; H5 t2 f, H+ C2 m, C9 K; Ttar -xvkf test.tar.gz
/ i/ Y9 Z+ ~% S特别提醒
9 R' ~. f5 ]; X9 U- ?
3 i0 j' C9 F, n9 g& e, M- S前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。" |0 R" r M- ^' Z) P) W' W
zip/unzip" K/ a9 Q* h0 C- l. f
8 a1 t( Q1 l0 F7 j: p
zip和unzip命令主要用于处理zip包。
4 H' S N! {( V压缩6 E' p$ |7 w/ T7 o4 Y. m7 L
, d7 C/ [3 ~0 k; ~6 w; C6 R% G涉及参数说明:) s/ h7 L& L6 g; U. P' n
-d 从压缩文件内删除指定的文件。
$ ~) V" O0 ?. C# Q; f% |-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
2 \9 O5 ^3 H0 F' O% V-j 只保存文件名称及其内容,而不存放任何目录名称。, H' j' W9 Y: z" _
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
' j' B5 e' ~1 y-u 更换较新的文件到压缩文件内。
) E! M7 y+ F# i7 h) t' @: b-v 显示指令执行过程或显示版本信息。9 M8 \( g) s+ ?7 z/ F
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。( {! F' G/ `' a/ f% I
- <压缩效率> 压缩效率是一个介于1-9的数值。7 D# h3 g I" w9 x9 [$ U5 u
压缩文件
( S/ B. y$ f* |& e; R" d4 q2 O" r/ _$ g. q/ q( K
zip -r test.zip test/ #打包test目录下的文件
& F# p D: y, V: L0 q) q8 r/ Uzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
4 M! j/ P1 C! a指定压缩率打包文件. v: e) ^. [" q2 }. p
* A2 K$ ^/ i2 ?- U7 l& w( jzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长$ r" Z( }1 W% H+ l2 J
打包符号链接文件1 ]' q5 r3 Q! A9 j+ e
* _, F" ^( s D前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:0 Y3 ~" {7 C4 s$ y6 h# g
zip -ry test.zip test
T j* ]1 D$ N+ z. z" w向压缩包中增加或更新文件: K' O: J6 m, U& F2 {
9 J/ G$ w! L% C7 V" F3 M O有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:( F- |: }- H% m
zip -u test.zip test2 #向test.zip 包中增加test2文件3 U0 |! e/ g/ C: M7 Y
压缩时加密
9 \' z% l: i+ b) K( _$ u
7 o2 x% m& `: k& h压缩时如果需要对压缩包进行加密,可使用-P参数:! p# H+ Y, z4 M; O/ Y6 c
zip -r test.zip test1 test -P 66666 #使用密码66666加密( S A, _! A9 d4 m$ p
删除压缩包的特定文件& u, U7 o% H3 k* G( S
' T& Y% s, x( }" G0 ~zip -d test.zip test #删除test.zip包中的test文件
# Q( J9 N: d, r1 C解压
# H5 F9 G& J, O
! A6 w' p$ D3 |2 G; e% E涉及参数说明:/ S* b6 {! Q# Z1 {- X4 F4 x" q1 N }
-l 显示压缩文件内所包含的文件7 o; h! j: Q. |& T
-j 只保存文件名称及其内容,而不存放任何目录名称。
& H* ]4 A) H9 d; ]5 Q8 u-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该3 a* z* C2 R) n' i" i- s: l# f
-v 显示指令执行过程或显示版本信息。
$ u# D, L* f9 G1 y K7 F-d 指定解压目录,目录不存在会创建 M0 R' r) z9 n$ U
查看压缩包中的文件信息, R8 L9 a/ [9 { b
( Y6 b; b& z9 ` H i: i
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
8 s$ H$ u! B4 Y0 v' zunzip -v test.zip #查看更多信息,例如crc校验信息等
c: y+ B; T! ~; ]; U/ ^. \* `解压压缩包
& [7 g3 M" Z1 V, V M7 C2 c# \% f6 ^0 q( S/ P0 {) C
unzip -o test.zip -d dir #讲test.zip解压到dir目录
* F# R/ l) Q- n$ y解压包中指定的文件) [2 Q0 H/ J* a% z D# T( O x! u# f
& Z- s1 n) {' X- J ~
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:4 N4 O- @- K3 J7 p
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录; R' r7 B. s9 |5 G; O4 u
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件
6 j! h8 Y5 Q$ H- l3 Z) r解压时去掉目录结构5 v" D) r7 z5 s5 P6 U
2 _* u: O3 Z+ h, {/ }3 W) h
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
9 d+ n q G8 D$ z& B# xzip -oj test.zip -d ./temp . v B! ?# j' c; [6 j
解压jar包4 N+ ~5 \9 A) s% r% V; E' g& `
/ ~; Z9 E! ?2 p9 k/ j* f1 T) ijar包是java归档包,但同样可用unzip解压查看里面的文件:
! c1 x0 S9 R& Nunzip -o java.jar -d dir
\5 D5 S# q, \ \3 t0 agzip; J$ N% r9 G1 B' U9 y; z- R e3 p& O
' G! j& z# i. V m8 S
涉及参数说明:
6 U" L* p/ a7 Q% R: ~-k 保留源文件
* v: k3 ?4 X4 N1 W! i* X. h-d 解开压缩文件
9 L) [/ }5 r9 V' J! _-r 递归处理,将指定目录下的所有文件及子目录一并处理
1 x6 V' O& l) q1 E& N# U* t-v 显示指令执行过程; z/ V% `& \: x
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
& B; g" ]9 ]+ n; i, e8 g! Ggzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包# u, x( I# K; ?9 A
gzip -rkv ./* 递归压缩/ b3 } i+ z8 F v+ v0 q6 Z
解压也很简单: i4 l' D0 z' Z( @( }+ y3 U7 t; X
gzip -dv test.gz + W- h; b% Z% [) g# B- m X2 Z
bzip2
; ?* F+ ]4 q$ c9 k1 L/ S- w+ i/ S J& A0 U* i! Z5 z
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:: E. A2 N4 B( N% s1 j; ?/ ?
bzip2 -zk test #压缩test文件
+ a; B7 |) g) O4 ~6 mbzip2 -dk test.bz2 #解压
0 p) a t5 H) x+ erar/unrar
7 p, r9 R& s4 V: A
" d% e j+ l* c* Prar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:( z* f4 `% W8 c& J
rar a test.tar test #将test文件压缩为test.tar7 F2 n& b- R' ^) t
rar e test.rar #解压test.tar
8 J$ q$ T2 p! ]7 Vunrar x test.rar #解压test.tar
# U {- B7 p3 A7 X r压缩率比较
a; t' z& C+ D. O) [3 O- K. z0 H L
压缩率一般来说:1 W2 H, c3 R2 o" [9 O8 a' h& d. b/ i
tar.bz2>tar.gz>zip>tar
# w# J! l, C/ N- c" a压缩率越高,压缩以及解压的时间也就越长。2 I9 J5 e: x7 j. I+ h0 k
总结( ^! C0 R9 V2 i" y( Q% x- a8 t
2 q- [: F6 Z/ u+ q+ @
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。( v8 q4 |( f, L& ?6 c
有任何补充或建议,欢迎留言^_^。9 D7 V/ _5 U- M+ L' x- a
+ [! C" F$ T5 @$ N
5 l. X0 ~* O& X9 ^4 u' [% M
- h& |' ]9 }/ O7 p0 h1 p- F' G5 z: ~
|