! F- u2 k% [$ m# I' ~; N6 _% z) g9 w2 {
3 a5 w/ {" Q6 T; i5 p
前言
\& d/ [% W- t: x7 x
( {9 d5 o! ^4 u# }0 [" zLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
3 S n/ n3 g4 U; C4 vtar0 o1 R9 ? L# n3 N1 S+ ]; }
, E4 Z3 q1 I+ O3 z# O' f& U# v
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。+ l# K# T# e6 g% x
涉及参数说明:
?: k" L7 E. A-c 建立新的压缩文件
) ]' g4 ? z3 _. Z2 z/ f: u-r 添加文件到已经压缩的文件
) }: S# k7 [" c-u 添加改变了和现有的文件到已经存在的压缩文件& D# X& [( _* @% G; g
-x 从压缩的文件中提取文件- E" Q# e4 ~" @4 M
-t 显示压缩文件的内容& c0 q2 z, i$ S/ A6 y. B
-z 支持gzip解压文件0 ?. U' C- {4 E9 z( e) r
-j 支持bzip2解压文件
. O2 k9 [ ^# c-v 显示操作过程5 p2 M1 B' ?/ n4 G
-k 保留源有文件不覆盖
% e4 |0 g- V$ z% m4 y( S! _" A-C 切换到指定目录' G% L0 a K4 }$ }
-f 指定压缩文件; {4 p! I( W& @7 U8 ]+ i
6 D/ S9 { U: c--delete 删除包中文件
0 a( P5 c* q! ^/ S9 q/ \& x& l* B--strip-components 去除目录; T0 Y" s2 ?- l/ e
--add-file 向包中添加文件3 @. h: f# `! Y! z5 L4 `% |
压缩
' W, K% ~* P4 ~3 L! C2 M9 b% G; X
归档tar包,不压缩8 `% M* M Q- u, u1 b
0 F y# ]9 O: v0 p2 @5 ^' A8 _+ star -cvf test.tar test1.log test2.log #归档多个文件3 ^0 K% e) p" A
tar -cvf test.tar test/* #归档test目录下所有文件
@- X' d& C6 u+ X% J1 I! Itar -cvf test.tar *.log #归档所有以.log结尾的文件 0 Q% `- {# R3 z/ S4 u2 I: N: l
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。( E& n, `( v5 J: ~
归档并压缩为tar.gz或tar.bz2
% p- d: C# d7 K" l/ _3 @. s8 o, T! V/ K/ {
这种方式打包对文件进行了压缩:3 U8 _0 U$ N* [3 Q, [" P
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩9 f9 T8 }5 W2 Q2 Q! A/ f( R: Y
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
0 ?3 z/ ^% e) |查看压缩包中的文件
+ ^8 f1 {6 W( d' X( R0 e
. S% i7 Q' K. k" |如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:- U! P" I g6 P1 Q5 l4 V
tar -tvf test.tar #可查看test包中有哪些文件* x& [9 e6 Y. s# ^' m
打包后删除源文件# d# u/ q3 b( r# r, z
$ C/ S7 u& Q9 g: c, ^有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
o! y5 [* n y5 t- G$ [% Star -zcvf test.tar.gz test.log --remove-files
$ N6 U4 Z' p3 [( v1 B0 `* n打包除指定目录或文件以外的文件
% N( F7 ~/ i+ s2 n( U* _
. s4 e# I7 ?: K# w5 o对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
3 h' y% b8 u( c \5 M0 v1 R* gtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
# {9 y1 C8 ^5 E: m+ N' f$ T这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
4 d/ {2 m) _4 l3 b8 Q3 z( K# f向压缩包中更新文件( Y& G r1 E& H' u! J
( y- w. ^+ w8 z i
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
! Y" c/ q2 C* B9 z% Z8 w( ]8 M7 x+ wtar -tf test.tar --add-file=test #只针对tar包& k. r1 y& D5 ?/ U J2 D5 u
向tar包中增加文件# B& w) |" ^/ }8 b
, u Q8 e$ M! o6 p" b( K! M& U8 L& @# v向tar包中增加文件可使用-r参数:" E: \5 Q( |. C- G7 ^ E
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
( N- @5 g& f+ @1 v/ P2 m( |: }删除压缩包中的文件. L! Z/ W1 K; f# {3 }
9 v+ r. ?: R2 u% o. F3 N
在不解压的情况下,可使用--delete选项删除包中的文件:: p$ k" d$ A& @. g6 i8 F7 h0 M0 Z
tar --delete -f test.tar test1 #从test.tar中删除test1文件) }$ a4 E. f- d% |+ C, X2 u Z
解压5 O" Y& R$ _% E5 i
0 y, y& `! e0 ?% [# o, w% a, `) B解压tar.gz和tar包到当前目录
3 u+ w4 f( B5 i7 E" k$ _. X! G! [' _
tar -xvf test.tar.gz8 l. k# Q O9 ? z/ r8 j% C
tar -xvf test.tar - D" D' e, f+ N% D- e
解压到指定目录9 B5 t3 t. X$ x& q
7 @% {3 R6 w- T$ Y7 z
tar -xvf test.tar.gz -C dir. Y- s% F( @& O8 i' c
tar -xvf test.tar -C dir8 p- b) J* g2 _, a a
解压包中指定的文件
9 C0 a* N( V3 j3 v- H w* d$ b A) |( f- @1 C/ b! ^) o1 h
例如test.tar.gz包中文件情况如下:
5 ?6 d( A$ Q4 c8 J6 j. X( F+ @2 n1.txt
- T4 j0 ?0 C- J. v, `log/
4 ~8 T6 n3 M7 Ulog/1.log- ?4 m% d8 `- i9 c; ~
log/2.log
. D( ~) ] j% L1 h- q" O' _log/2.log
) k9 l5 B4 C9 z/ Q$ z9 N& ^! I6 z& }log/4.log
2 X7 o. b2 M& k( A% g. elog/5.log
. R/ V% D* Y* j4 n0 {如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
- N' W- c& n0 j/ ytar -xvf test.tar.gz log/1.log, G% b( c; `8 @: W4 W1 }8 c
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录2 Q; a1 ^1 O# @# N8 L* t
解压时去掉目录结构; H# {( W/ Y8 D! v+ @' F
4 U: ~) y+ n6 @# v( n& O% E4 V7 p压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):- F+ `2 y. \0 ^; m* \
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
U* Q1 f( V& E# `0 T$ F解压时不覆盖原文件, s' W0 ]8 T9 ]+ m
2 \( q L# R" j9 |% I/ a当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):1 `0 @; e% v( x' x. H0 t$ w- l
tar -xvkf test.tar.gz
$ l3 R) U! J1 ~" ? ~特别提醒
! C* b! L. J7 J1 q# j2 t0 [: n) Z, n/ w
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
5 d/ ?$ p3 r3 [0 H8 ?2 B, _zip/unzip: A9 Q4 i8 F0 X7 X+ s
. Y5 ?, c _" u; \/ {( bzip和unzip命令主要用于处理zip包。+ z( g% ?# H' i& J
压缩
5 L! ?, _) \' y9 {* f) T% c2 c
2 V) E/ K5 z; B8 g2 C涉及参数说明:
# S! Q% C2 u/ |) H) o0 m-d 从压缩文件内删除指定的文件。
7 ^1 j: t+ f% F- ^-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
: f4 [" {- {/ E' K0 q-j 只保存文件名称及其内容,而不存放任何目录名称。
! Z4 Z. N! ~+ t-r 递归处理,将指定目录下的所有文件和子目录一并处理。
0 c9 O3 S( R& b8 @: P/ u% I; d9 M* q-u 更换较新的文件到压缩文件内。: a% Y' T1 x( i# X% f: g# }
-v 显示指令执行过程或显示版本信息。
, c, z$ z5 C5 X. `/ n- G-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
0 G! u) E3 u: W7 H- <压缩效率> 压缩效率是一个介于1-9的数值。
# k( J( c! i% ?/ U压缩文件, Q2 F/ V; T( @5 H& Z
5 i# m8 A5 S: K/ ^0 C: C: ?2 |; V$ |zip -r test.zip test/ #打包test目录下的文件
2 i8 Q$ }3 f9 S& s Ezip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录; x5 v8 I0 z' D& Q
指定压缩率打包文件5 Y+ K# }6 K- f7 _
( G2 n% }& X$ I1 e& o5 n' i* n
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
/ h! K' t! W7 \打包符号链接文件* f5 e1 ~- h; |7 B
( h2 O' D7 M# {. ^) r
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:. b' ~3 n2 Z( p( d5 @, e1 j! b
zip -ry test.zip test' h R; ~7 }. l" K6 l
向压缩包中增加或更新文件1 d* m' P0 q$ c$ d
9 Z5 ^) e' q- i( ~. ?
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:" ]4 B! o' V; E2 I
zip -u test.zip test2 #向test.zip 包中增加test2文件
3 s, [- N+ s, q" x+ b$ F5 j# V8 n$ Y压缩时加密
7 d5 P7 U2 l3 r3 ^5 I& m2 L$ _/ C: ~# e w R4 |( q9 E
压缩时如果需要对压缩包进行加密,可使用-P参数: [6 `! h0 m5 \! y$ I: ]* I& H- k& B
zip -r test.zip test1 test -P 66666 #使用密码66666加密
# p# C/ A: g# m( K# ?删除压缩包的特定文件+ V- k+ S* _: P
* Y4 r; [: }3 h3 z* m8 Vzip -d test.zip test #删除test.zip包中的test文件4 |: _4 o7 L- c9 |# U
解压
& ^2 t7 G& G0 ~- D/ S
" w! e# q. L. p5 g8 ^7 K# _. z涉及参数说明:1 T: F% M0 a/ ^! D
-l 显示压缩文件内所包含的文件3 a ~3 [% z8 T& |5 V
-j 只保存文件名称及其内容,而不存放任何目录名称。$ u; B& o; u. Y) O
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该- I, f; Z* `* `, a3 N1 V
-v 显示指令执行过程或显示版本信息。: w \- ]2 B% A( L4 W, ?3 |9 p; x
-d 指定解压目录,目录不存在会创建
8 X4 S, k v) |" _查看压缩包中的文件信息4 N( `* I7 U6 o3 n$ |9 J+ Z3 e
9 ?0 b; X: B. \unzip -l test.zip #可以看到压缩包中的文件名,日期等信息( A3 F$ m7 w9 e* u
unzip -v test.zip #查看更多信息,例如crc校验信息等
7 M6 x. s V" v5 L6 C7 b, y解压压缩包
% ?" H; i$ d* F( r, t+ E9 X( i
3 n- `, c" h8 w% R. nunzip -o test.zip -d dir #讲test.zip解压到dir目录
$ `5 ^- X# K! s" z4 U/ G+ F解压包中指定的文件
; {& ]1 ?9 {- h6 J3 o8 T: M! A2 M
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:3 q% R4 c2 k$ @1 w, D3 J, N
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
6 Y9 Q( r" `0 e& yunzip -o tet.zip "*.log" -d dir #解压包中所有的log文件 P9 W0 X3 h1 S. y* s3 z1 t
解压时去掉目录结构
1 @' \; ?( a5 Z( r7 J5 ` b% T M o8 B/ {) I
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:1 b+ J [7 {) k- O2 l
zip -oj test.zip -d ./temp : R/ Q {) Y' ^3 q5 \
解压jar包
7 ~4 P; Y) J. @ q3 [* A& C, J; z( [- t4 F
jar包是java归档包,但同样可用unzip解压查看里面的文件:# }) _3 {- M# E- [
unzip -o java.jar -d dir. p# P- k7 y0 t) |' y
gzip
5 \4 Q# K D! K* ^5 l3 _$ b3 Y+ f/ c# M
涉及参数说明:; s" S J: t$ M* ?% v3 B% E1 H4 F
-k 保留源文件- \; h2 l6 d# W: O. I) W& p2 I- B
-d 解开压缩文件
. ]$ Z: o; D, @. k9 k9 T-r 递归处理,将指定目录下的所有文件及子目录一并处理
( M' B: R+ N5 N% o2 F/ `9 _-v 显示指令执行过程 C y* n! B5 G3 \) a
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:& Y2 ]3 V6 _: r
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
( q0 O1 \% p- f2 f2 Q& R- Wgzip -rkv ./* 递归压缩
; g0 w4 a0 }! r# f, A解压也很简单:
( Z, G! m6 \! H# B* s2 @gzip -dv test.gz
8 o" r7 D# C3 o8 [ l5 Mbzip2
; L I( h4 c1 G1 }( k1 _- R& ^' S
7 l& N- U G" m: S, W+ A( g4 Ktar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:8 I% L. @' ^/ ~4 R) h
bzip2 -zk test #压缩test文件 Q: P# `' n: O0 G8 \
bzip2 -dk test.bz2 #解压. S# L: N i; h) t- p2 J2 k
rar/unrar
' U9 u s; c1 N5 @2 S$ @- n& N' j! B3 ^* [$ c/ t! \6 w
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:- ]% s6 ?* {+ }( }( R
rar a test.tar test #将test文件压缩为test.tar
$ a$ ?. P; O1 \# h( Irar e test.rar #解压test.tar
# |3 A9 \, N/ S9 Xunrar x test.rar #解压test.tar
! Q; B& b* ~# `1 N$ k7 Q3 B$ f! Q! u压缩率比较
% s+ V5 C E1 k3 ?2 [2 H* C6 d d# q% f" o
压缩率一般来说:
) k% g! _1 \% j ~tar.bz2>tar.gz>zip>tar
, Z& Y) ], v# t. J5 Q/ C压缩率越高,压缩以及解压的时间也就越长。
' a# H! d5 y9 r总结
1 s3 q# k+ I" E$ w
" d! P' k2 X7 K2 k! m* B对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。 t( e: |* O# {1 F
有任何补充或建议,欢迎留言^_^。
6 g( D, u c& a( i0 E' r3 J- D4 W6 Z0 [
7 T+ r' \ \. i. a
3 ~, D; n0 H: P% i0 |3 b1 K: Q! h9 E* N
|