& @; ~0 H* f8 l* E. r) d" i4 P" n! d- T$ ?! C. U
: S4 u4 i% K, f- N7 V- I
前言$ h3 A/ h1 n2 t/ {
$ g( c8 N) a! |/ w! W% S0 O0 {Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
/ B% P2 D1 V! H4 ], n2 gtar. t! `- E6 ]4 j' c9 {, h0 a
/ [/ |* I# R7 ?, X% o, A7 jtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。& h) p. J1 W- C6 M
涉及参数说明:
- g$ Q# l x1 Z-c 建立新的压缩文件
5 L( P3 V: A6 k: V1 i-r 添加文件到已经压缩的文件) ?1 H7 m: T! ?) |/ M# {
-u 添加改变了和现有的文件到已经存在的压缩文件
! e. a ~: S/ S-x 从压缩的文件中提取文件' n4 s/ L" N1 u7 U
-t 显示压缩文件的内容6 q/ \" `$ O" p$ i( ~4 X
-z 支持gzip解压文件
' O! R9 T3 K- w) Z C-j 支持bzip2解压文件
- E" i6 b* l' s-v 显示操作过程, T" N7 M) i$ {' [9 f% l- t; r
-k 保留源有文件不覆盖5 h; o1 G8 q" {
-C 切换到指定目录
; h: K; B8 U% a# T; G2 J-f 指定压缩文件
9 {- m; v! P% Z% H6 @0 Q, l4 A8 W* _0 b
--delete 删除包中文件" T' w! s6 w/ c$ V9 r+ [
--strip-components 去除目录
2 i# f' c0 K: Z3 ]! i5 }. d$ O! W) n--add-file 向包中添加文件8 S" ]" B/ `' C% G, ^+ a9 F
压缩
8 ~ {; Z1 k, k* Y6 |+ p% z9 m# \+ f( M& e9 M1 j0 n
归档tar包,不压缩
+ t2 B2 n }" \6 d7 q: X- \) [) V" G$ T" _( j0 j
tar -cvf test.tar test1.log test2.log #归档多个文件5 `1 ~, V- Y: ^% F' k
tar -cvf test.tar test/* #归档test目录下所有文件
5 k8 e, ^- | j$ ^. ~tar -cvf test.tar *.log #归档所有以.log结尾的文件 5 C4 d% F% d& r, F& f
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
2 u) F! A0 h* i6 e5 p2 O9 j归档并压缩为tar.gz或tar.bz2. u& R% X7 I4 C) {
, r, \5 ?4 \5 f% `8 I$ m- q这种方式打包对文件进行了压缩:( z# ]# F3 j m& }1 \
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩8 ~, c# f3 }( Q, p; T, T1 ]
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩/ M9 ~) e% V1 B p( `. |
查看压缩包中的文件6 S1 F3 f* S+ n3 m0 j
* R' n. [% }5 _$ l& z
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:- y* J+ A6 O- J5 f0 V! {
tar -tvf test.tar #可查看test包中有哪些文件
3 `7 ] W; s* m- X- a7 b5 y6 w, w打包后删除源文件, I" C* d! _* |
f w) @; U6 @/ H- k有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
5 ]7 G" G% O# \* Y. z3 Ztar -zcvf test.tar.gz test.log --remove-files
. ?+ f: A0 A8 E3 X$ j1 M打包除指定目录或文件以外的文件0 i; N8 f2 N" i+ s8 u- O7 L& p
, E5 x" T L3 o( w% R
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
2 F+ h: g* n y! C' ?( ]tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件7 a9 K! e3 o4 h4 K
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
8 `+ R/ b$ j3 l# g/ @ N向压缩包中更新文件
% k! ~! N5 }% s, O5 V
! i0 _: a* h" l2 y; \例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
4 {0 R0 n- w/ W+ J O% mtar -tf test.tar --add-file=test #只针对tar包
1 z j/ C, X* Y. C$ v4 T D, l向tar包中增加文件
& Y3 k$ h9 o2 w' ?9 m* N; R, [
2 L9 g- w( e! d' }! X5 z- ^8 p' U向tar包中增加文件可使用-r参数:
3 x) b% j( o. ]" v+ X* Ctar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
4 j) W; B0 \0 e& M& {: O; k h删除压缩包中的文件/ B. H' P, T) F! u1 K. l
0 [+ O Z8 {" C/ R n% b
在不解压的情况下,可使用--delete选项删除包中的文件:! I: z7 B! z3 j/ m8 y, J
tar --delete -f test.tar test1 #从test.tar中删除test1文件
- r' t: ~# i/ A# @+ u6 R8 l2 r解压2 Z& c0 S5 n# c3 L
: x2 n5 Y8 ]8 a, W5 Z
解压tar.gz和tar包到当前目录
- S7 z+ O; l, W1 W t" K1 c8 ^3 g( S1 V5 {; H* D
tar -xvf test.tar.gz, H# A0 ^& N0 n8 `6 m' S
tar -xvf test.tar 7 u- n9 P( W7 a+ Q r
解压到指定目录
' z8 [6 D$ {) r$ S/ ~: m" X! E8 ?& s, p: N, q/ z" D2 p
tar -xvf test.tar.gz -C dir7 R* d1 N( B. l! @4 F6 n1 y
tar -xvf test.tar -C dir. q& i6 D. w2 _
解压包中指定的文件
+ W6 C0 S* a1 f m; }- m' d
( `( y/ j5 F4 m4 B$ ?( Q; `例如test.tar.gz包中文件情况如下:) ?6 T6 }, m( V6 n
1.txt+ ]' K2 U4 Q" s4 C0 j
log/0 u# y, U# ~) e0 o; }( D5 b, F6 h
log/1.log
: u3 Q' u( C7 ?; q$ \5 I, q1 Flog/2.log) `$ {( u" R$ G/ p' g
log/2.log7 d) T( C' w/ A, ?5 p6 d$ ]8 @- ]
log/4.log
6 b6 N' x( K/ z9 k, I, {/ Olog/5.log+ C9 C: }1 b1 N+ R) d
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:+ @! }" P; p F& V7 g4 x A0 X
tar -xvf test.tar.gz log/1.log
' _4 B& w( X9 l" T9 Xtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
" Y4 T* ~( | V7 M/ ^0 C1 g解压时去掉目录结构+ ]1 {1 t" H3 k {" z, a# M
3 K( z$ B; W8 t
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):: I" E, |' l% y8 e: `3 r9 c
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录; y% m& w& `3 i
解压时不覆盖原文件
3 P; m/ U! G1 r" a+ a+ q; Z' P' O; S3 s+ c; {1 M3 B: c
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):5 B* B- \2 P2 C0 h) A
tar -xvkf test.tar.gz
( Y8 k! s! W! ]+ z# X; d特别提醒
, Q( g% X1 o) ^# e2 ^
$ H1 D* A! D; I8 g3 _7 a& @前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。) Q. a4 P# w0 k- R& L
zip/unzip
& }# O* d# F' `4 M* C/ r% q& B; T
. ]( ~# B0 g. P. Bzip和unzip命令主要用于处理zip包。. Y+ K; C( v, m" X
压缩9 c& B, x# u. x
8 c/ v# Z# M* B+ j1 \涉及参数说明:. O7 o. U( _4 r; Z+ O# Y
-d 从压缩文件内删除指定的文件。6 h ]* ^8 M# x
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。' o2 K. ? e3 c' m2 t: B
-j 只保存文件名称及其内容,而不存放任何目录名称。
, a/ Q: ~" W- `+ P2 K7 o-r 递归处理,将指定目录下的所有文件和子目录一并处理。& t$ Q1 Z; a6 e1 h. G* f4 ?+ \( T
-u 更换较新的文件到压缩文件内。: f6 V4 j3 K# O( n+ I- g6 E
-v 显示指令执行过程或显示版本信息。
# R' c9 [" |1 W# g) G; G2 [7 n-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。, m' [% q1 A" I8 J
- <压缩效率> 压缩效率是一个介于1-9的数值。
. O8 d7 |# h% v. m# }压缩文件
) _; P0 ~" q4 m6 z4 Y; T8 I
' H8 k) Y8 N) c* L) X) `7 D0 n# zzip -r test.zip test/ #打包test目录下的文件
( T0 l3 v: d) T0 H: bzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录/ y; P% j- W% n3 d/ R# S3 w
指定压缩率打包文件
' Y" }. X* \4 O2 P* k; g
' S- H# H4 o& L( ]; G" Mzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长! ^& _( P7 O( \
打包符号链接文件4 w; p- L2 R6 Z( k
/ p) r& M$ A. M. c前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:- [; A4 C- [7 N3 k: h
zip -ry test.zip test
5 n0 I( L$ Y/ o' g向压缩包中增加或更新文件& \; ~0 t, t% u4 u1 L6 A1 H
+ o0 }9 {, K6 Y! k5 r" n# V' L
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
9 e; y9 E1 M9 ?. L; R) |8 x; Hzip -u test.zip test2 #向test.zip 包中增加test2文件1 w2 L* i" o& `
压缩时加密( E; Q% I x" v% ?3 o9 e
2 c( Z2 q l. Y- y6 N
压缩时如果需要对压缩包进行加密,可使用-P参数:( Y! { p0 L' {3 P" w, c
zip -r test.zip test1 test -P 66666 #使用密码66666加密6 J9 r/ I( a# s5 v, Z ]
删除压缩包的特定文件7 h! Y, q# @4 A
, h" c- H* W) P+ F) h. n6 Ezip -d test.zip test #删除test.zip包中的test文件
' P3 l; E# i x0 _ Y- ^解压
8 t9 V# I) N; |$ X# o
* f! G: i# u7 l3 Y2 D$ H8 h涉及参数说明:
; O; [0 c" n9 @$ H7 i' r-l 显示压缩文件内所包含的文件
. }. z+ o7 f! i6 D% h3 E, e-j 只保存文件名称及其内容,而不存放任何目录名称。
- T( e- J- b: P9 r4 p9 q-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该. o1 U5 I! L6 ?0 b2 Y: a9 `5 q, s
-v 显示指令执行过程或显示版本信息。! ?' A1 q1 {) R3 l
-d 指定解压目录,目录不存在会创建
; \; @: N" U% ?! ?查看压缩包中的文件信息
# B: R# n$ F6 d+ P3 E( c$ @# B1 x6 |2 h, r- E$ B- r* B
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
X% }8 i. [; Z% dunzip -v test.zip #查看更多信息,例如crc校验信息等
p+ @4 l2 e# v: w' F( j解压压缩包 n+ s' Q, F g( r) E. E- @
& ?" ^7 e* X q4 c6 {- aunzip -o test.zip -d dir #讲test.zip解压到dir目录% ]/ h. i& _( [$ m7 Z6 F3 a
解压包中指定的文件
/ J8 r5 p& I# z6 Q2 ]5 w: P9 w( a1 S1 E: T' E W& r8 _
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
+ t, Y3 h* O: z. T7 j5 [1 |3 gunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
/ @2 D6 F* H& E Gunzip -o tet.zip "*.log" -d dir #解压包中所有的log文件& @! n% }% Z6 @8 J4 ?& ^
解压时去掉目录结构
5 j: d& k5 V$ T7 J2 m1 A8 W* b/ ^2 }( a5 z
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
; X. u! L& X$ P; {& y' q! G$ W6 w0 xzip -oj test.zip -d ./temp
! a* b7 S& C" o4 n" L解压jar包; T6 h- w) v- j
* p# P. b* ~# V; y6 m9 X. B/ {/ {jar包是java归档包,但同样可用unzip解压查看里面的文件:
. ^3 g% f8 ]# ^% t4 l; q6 j( ounzip -o java.jar -d dir. \2 u# `8 T$ g
gzip
3 P6 t4 g3 s& S4 I+ p }" ^- _" O/ |# t& V, n
涉及参数说明:: q, { I6 r3 {0 z2 d2 w5 r
-k 保留源文件8 [7 o9 P* y: f/ R6 L" ~+ j
-d 解开压缩文件& ?7 o6 K) i$ O5 P A6 P5 T P
-r 递归处理,将指定目录下的所有文件及子目录一并处理0 p4 t* v2 m" B0 W7 E8 ^* l' p+ c
-v 显示指令执行过程7 ]3 N3 _4 N: t: j
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:# g& I7 [ t) H" Y2 Z
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包- V% D3 e" ?! t% Z% T( @; M( _
gzip -rkv ./* 递归压缩7 w0 j2 g" w+ V- c
解压也很简单:& h) _8 V! ?6 q+ o0 O/ t' W
gzip -dv test.gz
. W3 S1 C! v6 D9 L) Cbzip2
* K: M' r/ }6 k' s% i" O
* J- L( C, ~7 h# Q8 Htar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
- `$ }* L8 o/ y+ K V( Bbzip2 -zk test #压缩test文件& Y$ X3 C/ w) O. u5 a
bzip2 -dk test.bz2 #解压
" B" [# w4 D2 L* o6 J5 Y) \rar/unrar
* p* \9 E, f/ f# g% u( l
5 b( a& Y7 a& Q5 j6 S; M; \rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:; y/ ~2 w$ E$ d7 R0 r
rar a test.tar test #将test文件压缩为test.tar
- T! Y8 v+ l; T6 S( q9 X; rrar e test.rar #解压test.tar
( k( ?" C( m% G4 [) D9 I7 k9 I; aunrar x test.rar #解压test.tar; y1 N6 t0 g" c* U( h
压缩率比较7 c0 m( }7 A6 f5 u; `+ Z& y5 P
+ Z7 r6 p- v2 w8 S- Z
压缩率一般来说:5 l2 w1 ?) C* T e) e" O
tar.bz2>tar.gz>zip>tar
v/ _& M7 n. G \) k2 o4 }0 d压缩率越高,压缩以及解压的时间也就越长。
+ q+ F) r& x0 n- }- e) {2 N总结
+ \# r, w+ r" t4 `) {8 x# r1 z* s2 g! |7 _2 u- _8 K
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。. W$ O( O0 g- [5 W, ~1 `' g
有任何补充或建议,欢迎留言^_^。 M+ I" ~2 f s. v" o
. }, _( K, W- Y& Y; O8 N3 r( z. l1 e6 z4 C
4 {9 F0 Q) r5 u
# f- c. u9 O; Q- f
|