2 B2 r' d% E+ a: J
5 e9 L# m6 m$ I# G2 X+ c
3 M& g* t5 G2 l前言- L5 ^: Q& `: d( o
. o& {4 e5 X, n$ nLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
$ ~, u8 W( g& ^$ z+ i- G& y6 h3 ktar
1 F4 J. ?) i8 e4 T, s: g0 F
x# e7 u( \! w/ B. X+ F8 Y" Rtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
% r/ Z+ @6 i; ~) [涉及参数说明:
0 `5 L7 x1 p; G6 ~1 d3 ~-c 建立新的压缩文件
4 m' ?, P! m+ Y2 A& ^-r 添加文件到已经压缩的文件
, @! n1 h3 C8 ]-u 添加改变了和现有的文件到已经存在的压缩文件
( _( S: Q. ~" ]4 D-x 从压缩的文件中提取文件6 F2 F# ~' y3 c; M, d5 f
-t 显示压缩文件的内容9 z. V+ U5 U |
-z 支持gzip解压文件0 }' S. C5 G9 M- g/ s7 i) o& n' O
-j 支持bzip2解压文件" r0 F2 T5 \' v
-v 显示操作过程
( Q3 a6 G- I# L, N-k 保留源有文件不覆盖: D5 Y; i G4 [. N$ Q) `9 c
-C 切换到指定目录
0 S$ k3 E i1 G8 E% O5 f& E-f 指定压缩文件- v/ W# f. q2 e4 e& e
( O; {, i- j- H4 U" o--delete 删除包中文件
. E3 @' f0 z0 `8 T- F; G1 t--strip-components 去除目录0 T4 E0 D& X6 n) {% A; t6 j F
--add-file 向包中添加文件9 f: K" S1 |4 d9 q, P9 G
压缩 ` f; r1 R2 Q
2 E& R2 D9 d% o' G& i& `归档tar包,不压缩* \, L% C! x7 o/ G2 u
) {$ H9 Q. C; N) ftar -cvf test.tar test1.log test2.log #归档多个文件
) n# @% H8 M; P. |2 ~tar -cvf test.tar test/* #归档test目录下所有文件
3 ~# c% n) J2 _0 P$ Otar -cvf test.tar *.log #归档所有以.log结尾的文件
! {! |5 R6 b* O2 P由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。$ P* g" a3 W/ R
归档并压缩为tar.gz或tar.bz2
5 b0 b- K% P8 ~9 y' \7 B# c: b) Z0 M$ n
这种方式打包对文件进行了压缩:
$ c9 }( p9 L7 s( T( z7 Ztar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
* ~* q; c6 [$ `1 d5 b6 ttar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
* U5 d6 w0 {1 F/ f: U8 i u3 U查看压缩包中的文件% l; U' I" s2 \( s
; E8 j/ C8 K, m7 H& t+ ]
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
( o1 I; e9 z$ [' E/ m1 btar -tvf test.tar #可查看test包中有哪些文件
( Y9 j3 A0 i0 o$ ? r8 e/ Y, \打包后删除源文件
. J7 J" N+ h/ ~. X$ p2 i6 W0 s/ J+ N& q# J, l+ b* C/ h9 s p# x
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
: X6 K" [/ f" b; O) itar -zcvf test.tar.gz test.log --remove-files 6 }+ c. y% O( }
打包除指定目录或文件以外的文件
+ K: N* T( \7 z- Z
( s+ N/ Z( O- ^# j' d8 S) D: _' q对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:" a, }, Y6 F" D' X4 e3 ^% R, N
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件: W) z0 F: V. Q. F
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
% e* _( i4 ^" R4 m* f9 r1 ?' T向压缩包中更新文件+ w7 p; z1 {2 E* J6 C" E
* n1 j1 A. O: m3 _
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:4 M3 J; [. I/ I5 Q
tar -tf test.tar --add-file=test #只针对tar包) \2 K) h% ]& s% F) D
向tar包中增加文件7 k% s3 j# _) g4 l# [
2 `( D1 B" U4 z+ | E5 y向tar包中增加文件可使用-r参数:
- q1 A' l1 i* ]! J% }tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
) G, q5 r! o3 a& l删除压缩包中的文件- k o* k( O; D
+ R* g; n% b3 a+ N3 C在不解压的情况下,可使用--delete选项删除包中的文件:. A) p; f' w1 ]; c- ]+ T9 K
tar --delete -f test.tar test1 #从test.tar中删除test1文件! e# O: |5 z2 X U; q: D' s
解压3 o/ B2 {" V/ P5 Z$ @4 a: Z, Y
: E/ Q& C+ R2 X& V# d, c/ _: r
解压tar.gz和tar包到当前目录
( {) n; Y% u6 i- h/ n! i5 c# ~' F0 M9 }( n' M
tar -xvf test.tar.gz
e$ i4 @' g1 ftar -xvf test.tar % p7 m. E$ Q+ e7 ~* b3 k7 v8 Q
解压到指定目录
* I3 ^( [% k5 u/ _4 H) R' w
# k3 r' c0 h8 ^& m. ~' _tar -xvf test.tar.gz -C dir
( [' G; O4 O0 w _tar -xvf test.tar -C dir: N1 L4 N2 S# U6 F
解压包中指定的文件2 n9 V5 m. r' I# I0 G% y
8 ~7 G) D# ~& S) }4 u
例如test.tar.gz包中文件情况如下:
' k8 g4 v S: }' i! j& P1.txt
1 O, |# a: A; flog/
4 o/ M, f/ C1 a, G. p: wlog/1.log" F1 Q5 }% Z d/ B1 m7 R
log/2.log
' N/ w$ J( J! j9 c5 nlog/2.log
% s4 n. K4 O2 _' `! M klog/4.log# x0 A; n: `2 a, b7 \
log/5.log
/ [- z$ c/ D: d1 s如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
! ]. F4 n3 c- L7 E9 y- n3 `tar -xvf test.tar.gz log/1.log: E3 K, S& X- B) R P% [
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录& O& x& D. f5 f1 r
解压时去掉目录结构6 ]- [* P. |0 r3 b6 Q
4 A! m4 H9 a# K% p# X
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):6 a8 c, R4 g _! {, [: k
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录5 @2 s3 d) r4 s! p& o# V- c( }
解压时不覆盖原文件
/ t7 a9 l+ [# B# g$ a; }4 G( h4 `6 b( ]
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
T% E1 t# m7 r1 ] Jtar -xvkf test.tar.gz" J; b) K' r) m; [9 r
特别提醒
/ g( i8 K, M' K9 b5 W& [3 ^9 V% ^* q5 `* E$ B. s
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
R$ `- M' e7 e# wzip/unzip0 L( c1 W1 H& }: S }
# O# u" u9 o$ x e/ s1 a# x/ F. y
zip和unzip命令主要用于处理zip包。) l# q, y8 H+ w- q
压缩
( t8 o/ q) `- p S) Y- R9 J. O7 M2 Q% F, P. N# B: r
涉及参数说明:
% G4 P+ ?& H2 p! W9 j-d 从压缩文件内删除指定的文件。$ m0 l2 v7 i+ z
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
! x, d! Q2 r" p2 @-j 只保存文件名称及其内容,而不存放任何目录名称。
1 N8 J6 r4 _! J0 U4 f2 u# b-r 递归处理,将指定目录下的所有文件和子目录一并处理。
# Q, E( c% t* p8 a; y-u 更换较新的文件到压缩文件内。: _) N% l6 {: i- }
-v 显示指令执行过程或显示版本信息。$ |; g6 c/ \2 }1 Q1 E2 M! t
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
/ \/ ^. Z/ ^( U$ o! ]- <压缩效率> 压缩效率是一个介于1-9的数值。
- p5 ^5 ]6 \7 C- p2 `压缩文件" S+ o2 w+ @$ Q8 ~( ]
* z$ p7 ?- e# N0 ^+ r! ^zip -r test.zip test/ #打包test目录下的文件
. Z* u/ w1 W. i% \- wzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录6 {( w8 h: z/ A+ a$ A9 ]: b# V
指定压缩率打包文件
" I" ]1 m/ P5 Z/ k* U6 _$ k$ b: P' [3 ]4 K
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长4 I# H# O [2 v' B D Q# g
打包符号链接文件: q2 A! c$ |" N* E$ @& I
' `& ?* Z; Y+ p' A" C) Y
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
) A0 h2 @( n4 ~! ]4 v/ gzip -ry test.zip test% ?6 H& n$ X" r
向压缩包中增加或更新文件
- V4 w+ v$ Y) o, }
+ t! Q5 s0 N* M$ R j1 G有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
4 W9 O" B1 ]6 ~. L8 [zip -u test.zip test2 #向test.zip 包中增加test2文件4 J& G# `& ]9 d1 M
压缩时加密
8 i, w; c; V! P3 h- J$ \- U, G9 g
3 z6 u( P( C. f7 K) j \' u压缩时如果需要对压缩包进行加密,可使用-P参数:8 |. K e" s# e/ H: u
zip -r test.zip test1 test -P 66666 #使用密码66666加密7 b8 g( z- O3 _. {/ I
删除压缩包的特定文件7 W3 A Z7 v/ O' R( J* G1 i5 m
6 c) A. n3 @! v$ W' Y
zip -d test.zip test #删除test.zip包中的test文件
1 ^3 {7 D+ t; P$ G" k$ K5 D# {解压
. `6 {( s3 y( Q" u4 ?5 x4 i+ z6 A, v: X" A4 d1 d# ^( I
涉及参数说明:
2 e# p3 P, P% ^! ?6 N. E+ \8 n-l 显示压缩文件内所包含的文件2 @$ R( U$ P7 b1 T* [1 d7 Y! P
-j 只保存文件名称及其内容,而不存放任何目录名称。" |7 |- r& z. @. S- @+ J7 M
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该# l: R" o/ v. q
-v 显示指令执行过程或显示版本信息。
, G6 J( Y: p) d-d 指定解压目录,目录不存在会创建0 v3 t3 ?" u7 i0 v. J
查看压缩包中的文件信息
+ m& }6 {2 e+ [# I, d% `- }6 V6 U6 ]
5 M9 |3 z" e! U2 j1 \unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
6 G$ }% d3 S/ A! z/ ounzip -v test.zip #查看更多信息,例如crc校验信息等9 g, D" |+ R6 A* M+ P7 X
解压压缩包
3 u" \2 X# z @2 u; I. u' L( f( U3 c9 R) \
unzip -o test.zip -d dir #讲test.zip解压到dir目录
, R% h& l# C) [: D* i: J# s解压包中指定的文件
3 _$ o6 ~! Y' w5 t, |
' e4 W" _% ~# b7 n. b0 S- |5 o如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:& G% s# A( b& y5 J, E$ f, h/ W- {
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录3 z3 G/ O# U' G9 `
unzip -o tet.zip "*.log" -d dir #解压包中所有的log文件
9 x" R9 q- y, K/ `7 \解压时去掉目录结构
4 ?' E+ a) E% {; q: d
# p0 g O1 p2 g9 D4 W* D3 L8 N压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数: `: _: _* ~: }, ]/ i
zip -oj test.zip -d ./temp
0 j9 z, R- S* S7 E8 ~解压jar包+ b" x2 |- @% g4 ^, G
, m* I L- R4 a+ Z8 rjar包是java归档包,但同样可用unzip解压查看里面的文件:
7 }7 S m) h9 z" V. X- [unzip -o java.jar -d dir
8 h! y$ {; {: v- k; jgzip$ [ E, X% I$ d& m
) x! S! [" i$ X' W% a, m" P9 n( {# A涉及参数说明:
/ h% N0 u( s4 a4 S4 s-k 保留源文件% g$ c8 v) H9 [7 q; _$ b
-d 解开压缩文件
, r. E, @9 G/ O7 h-r 递归处理,将指定目录下的所有文件及子目录一并处理* \$ E* [2 R2 {! R$ H8 g
-v 显示指令执行过程$ N* U; `+ G8 i$ k& @
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:7 r, a K# D2 |0 W* f* f" Z2 j
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
3 o& U2 D, y5 j1 Y( A& x8 v7 ~gzip -rkv ./* 递归压缩
5 g3 R9 l( x$ M! l/ |( U解压也很简单:8 n4 A. G. H; Y! @
gzip -dv test.gz
- x& R! Z8 ?& L. a. H: ~bzip2! b v, c, S9 u( v& ~
7 v! V+ q2 G9 M( h, l# W
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:+ ?: y4 I( C9 I1 k( x) ^: |; R
bzip2 -zk test #压缩test文件
; E7 J/ W7 Y/ g" |- p$ V1 v7 E5 N2 n7 @bzip2 -dk test.bz2 #解压4 K4 a% f+ i& E) U0 Q
rar/unrar- x' u% n! t6 z# X1 `2 P# c
, N: M' H4 e" G: erar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
7 @% C* P3 b2 Y2 f3 A+ K7 |7 Z( W- ^rar a test.tar test #将test文件压缩为test.tar
3 l" U6 C3 I- B6 S2 J+ ^* R% p" ` |rar e test.rar #解压test.tar
4 a9 x2 E' L0 dunrar x test.rar #解压test.tar
: ^8 \/ y! {8 J压缩率比较
/ a3 }6 m6 Y( q! \6 Z
# X! W6 ?! u. Y8 i压缩率一般来说:
: W7 S, A- d" l3 {) Vtar.bz2>tar.gz>zip>tar: @' r% x1 r) v. O* d
压缩率越高,压缩以及解压的时间也就越长。
( o4 x9 [, l( c, y9 ]" w$ r7 D7 X总结
" l K$ R6 f3 S8 s7 w
0 a. L! ], s# w( ?/ Y4 D对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
$ u' E) t2 p+ H* [& P有任何补充或建议,欢迎留言^_^。
4 M4 c1 H, X& e* h, x
4 d1 ^1 p8 d4 H% C% _1 x6 z5 F8 _$ Z
0 T. k7 V" r, ? l& g7 Y/ R
* Q7 P0 n- a9 k9 }# g" `' [* z! v
: \' u, S" R" `. g$ i
|