2 E l) y. W) `3 \- q+ n1 D& u$ S% E; T
' q( [& Y, a9 \% @) }
前言
* e9 s% o5 M( q$ V% q$ f
8 }# u8 Y* M3 WLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。 f/ B6 R3 |4 K+ b2 N, ?; N
tar
# _2 ?; |+ K' U' @+ x* W' s7 j8 t ^# S: J: B
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
% n9 u: S3 C; g6 ] t1 T3 C涉及参数说明:
: I. Y6 E8 a8 R-c 建立新的压缩文件
- m0 A$ c8 U, k, C, O, u3 E-r 添加文件到已经压缩的文件) k- J C3 Q6 g
-u 添加改变了和现有的文件到已经存在的压缩文件& P; S7 |! X1 y1 L8 a) P8 p
-x 从压缩的文件中提取文件! L$ {' W4 S" ^* D& t% t2 C& Q+ E( F
-t 显示压缩文件的内容% A1 d6 L1 d: Z
-z 支持gzip解压文件
+ s- q2 m, F; {; Q' s# {-j 支持bzip2解压文件
+ [, o# E, P- F+ I-v 显示操作过程% n3 z4 \0 F) Z8 v: @3 ~, X5 S8 u
-k 保留源有文件不覆盖
' i+ `/ Y! ]5 Z. V& P3 t-C 切换到指定目录/ ^ U* v+ R: U( w: R; g2 {
-f 指定压缩文件
9 p0 x6 q9 Y+ ?) b6 ~! ?! j
: ?0 t& W' G. x- N9 z--delete 删除包中文件1 Z; \9 V, z/ g2 o& i; x( E
--strip-components 去除目录
+ ^8 u6 u& h6 {; o- A--add-file 向包中添加文件# h( _9 x4 a) O% s
压缩
' `. {: d$ s, h. r/ g8 e4 C! g$ z, ^8 _, j n
归档tar包,不压缩
; C8 g; f- o- N% H+ m7 O
b0 Y" G( \8 n: a6 U5 i, Dtar -cvf test.tar test1.log test2.log #归档多个文件
% }2 l5 o5 B8 V: q* h/ Otar -cvf test.tar test/* #归档test目录下所有文件 u \; g: J5 r
tar -cvf test.tar *.log #归档所有以.log结尾的文件
/ O0 Q) g, y; a) t5 c. l3 Q由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
. Q( k- t! I5 p4 A6 m归档并压缩为tar.gz或tar.bz2
$ }3 V/ M3 Q* H( c+ {+ H2 a3 X/ `8 h, h9 n5 t& t1 W
这种方式打包对文件进行了压缩:
+ ^8 A, i# O- O) {: Xtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩- J4 J! F6 S2 ~5 E9 Z! \2 X
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩9 A2 b5 ^! f0 {+ W' A* B9 i
查看压缩包中的文件% J, |: A% v, M0 {9 N$ S6 z* h
; \) K) P3 g: [ C! f% V
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:- v( b' F, `. I ]; y
tar -tvf test.tar #可查看test包中有哪些文件# s( i3 z6 e4 n+ Y% \) S& ?
打包后删除源文件% Q. t- S" A0 o4 M) o
6 y- b6 _* w" d有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
$ c6 w. D; d! |' J! ?* x) e) Ptar -zcvf test.tar.gz test.log --remove-files . w8 ~9 k9 |$ [% }3 l
打包除指定目录或文件以外的文件7 z/ Y0 `$ R4 K6 u. L& y8 D8 H4 l
$ T' B4 `; ~* \2 k1 `对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:1 Y$ B( _3 k$ T j* O8 l; w
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件/ W8 u9 ~! G& Z, S
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
; }- J4 U) E6 q3 M' h向压缩包中更新文件
, @1 J' o- V9 p3 Q/ y! n' N% E1 h4 g8 p3 H' A
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:' r7 W3 v6 X7 C: K3 l
tar -tf test.tar --add-file=test #只针对tar包* \( v* ?5 t! c6 I
向tar包中增加文件- f' J( ^7 n7 p: K% m3 x
9 y s2 X; K2 O: P) F [3 p8 L5 r向tar包中增加文件可使用-r参数:7 `6 K; R0 @! |; y
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar包
% z$ ~' u) |5 G. c& R2 ~5 g X( m删除压缩包中的文件3 V/ l- e* V; c2 U4 E; Q9 s
+ K3 E% R1 G, U+ b8 s) }4 H' t" k' |; c
在不解压的情况下,可使用--delete选项删除包中的文件:
3 K" u1 {. ^ b5 ctar --delete -f test.tar test1 #从test.tar中删除test1文件
3 X* R; R( s. X0 b' R解压1 C9 i* ]# P( O: v
9 V* ?6 l4 F# y0 h解压tar.gz和tar包到当前目录4 f% k0 F) ?' I5 N4 x G
" _! V _8 I" ?7 Ktar -xvf test.tar.gz6 Q) ~: j( B9 T! p
tar -xvf test.tar % W# w+ d4 i% z) r/ S2 f
解压到指定目录$ |/ E! f5 i% r+ y5 c
5 U8 C( T( C! q. B7 r2 f- {tar -xvf test.tar.gz -C dir
/ C' I) y. w+ u4 vtar -xvf test.tar -C dir+ n* o" W0 u8 A& s
解压包中指定的文件
3 E2 |# |4 t1 i. E$ D) E/ i7 U+ [% }2 ^0 v3 ^
例如test.tar.gz包中文件情况如下:( F* D" ^; V3 r+ L9 l: b6 J9 `) U
1.txt6 {* q$ U( ]5 v" X
log/
- x5 q w* r" X$ {' {$ _log/1.log- C, A4 O! C/ r6 q2 b
log/2.log
4 X6 x" A' U; |log/2.log
1 M/ B3 e/ S& Elog/4.log: d; m2 p1 C) k9 j. ^- h
log/5.log& y& Z' ]7 v2 s
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:* z! P3 q" i6 B5 z& B
tar -xvf test.tar.gz log/1.log* o7 U' Q; X0 W8 j( h0 Y J/ {( h6 r
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
& T, g; j& F! e解压时去掉目录结构
4 n% L9 P& t$ H9 i; B" a4 _) U& I6 G& | {
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):+ D; O0 w% a( t8 X
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
. b2 H0 x3 c+ S a: @9 E解压时不覆盖原文件
/ D! C) H! c/ z' k7 ^* w- w8 L6 K3 u
* E' c' r. N4 t/ B* p当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
- R: i: u. F7 l; l2 n. `0 j7 etar -xvkf test.tar.gz
& C3 l/ h9 e" B2 [% G- U特别提醒
' k* P/ X1 b# a2 }& ?0 A# C. u' G0 M
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
; V$ m+ d, H/ W9 Uzip/unzip
4 G; w- m8 }" ?* D# g; P5 q2 R; l9 E$ O6 K; H1 V& i
zip和unzip命令主要用于处理zip包。
$ `* {3 s# z- P3 Z z( M& k压缩
- X7 o. d2 }! }& U/ d& Q% @ G9 k0 s, R/ b8 j9 G
涉及参数说明:3 @7 I* F# t( e1 ~5 P1 y
-d 从压缩文件内删除指定的文件。( N. |) L0 Q8 j) T
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
4 j" v8 R& A5 Z% T! }/ e-j 只保存文件名称及其内容,而不存放任何目录名称。) R: M& I/ n9 q% q! e
-r 递归处理,将指定目录下的所有文件和子目录一并处理。9 x$ m" Z3 l, f# A, K' c; O
-u 更换较新的文件到压缩文件内。9 d+ P( u3 V6 y* i
-v 显示指令执行过程或显示版本信息。
! @; a* A. x9 `8 i, G! Y. v( w-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
5 K4 x+ x5 O3 i& x- <压缩效率> 压缩效率是一个介于1-9的数值。) V9 [* ^, ~ \) R. M8 R
压缩文件7 S! d" d! U/ r* O
, J' s& @* _+ p( d
zip -r test.zip test/ #打包test目录下的文件4 r# ]1 A6 Z4 \9 b
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
5 H* T; D6 h C4 H$ i2 X3 U指定压缩率打包文件
- f; w. Y. S4 Q6 E, R* x( N# D v) B& x" p) P" ~8 R3 s
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
8 ]! L; h4 }6 `& s" A0 @2 R打包符号链接文件. H( c, l! F+ C
: H$ H7 ]. i% x( p7 H前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
9 F6 w% z* \8 C8 szip -ry test.zip test
3 A: }% {5 Q2 ~, I+ z向压缩包中增加或更新文件
5 Y" @' t9 |1 L7 e! X" Z. I/ Y5 I, J( ^8 |+ v# Y1 S. n7 E
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
0 Z% ]6 l1 f* |( {8 m# |zip -u test.zip test2 #向test.zip 包中增加test2文件
. I5 l' S1 i, s o% X$ U压缩时加密
' t3 c2 Q2 j6 A" `) f9 C7 w7 ^; n* G4 X; y5 P8 r
压缩时如果需要对压缩包进行加密,可使用-P参数:* X; }' `3 F3 a
zip -r test.zip test1 test -P 66666 #使用密码66666加密. V: B) B; }, V( c
删除压缩包的特定文件
7 `( U% N' b: J; z) h+ B0 ^: O, \ U& Q' D6 b
zip -d test.zip test #删除test.zip包中的test文件
( o+ A" V& {, X/ z4 S解压
7 M& o& v' C3 M7 e
' i( W2 U/ O9 m涉及参数说明:0 d7 ~5 O1 Y* J
-l 显示压缩文件内所包含的文件
- K5 g5 C" G3 w# y-j 只保存文件名称及其内容,而不存放任何目录名称。
! ?: B; \* U e6 R7 {, B/ D-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
1 O" |3 n7 \: r( O2 K3 b+ {-v 显示指令执行过程或显示版本信息。0 Y8 S @) M& b2 Z- w$ `
-d 指定解压目录,目录不存在会创建
2 E7 P4 q. U6 e. I. W9 Z6 L* u查看压缩包中的文件信息
9 o% s: k2 Y( G. ?9 j J7 O
8 j# L. e9 j Bunzip -l test.zip #可以看到压缩包中的文件名,日期等信息, r! [# N$ ^7 S' v# D
unzip -v test.zip #查看更多信息,例如crc校验信息等
4 B# X$ F- B! D解压压缩包
: t2 l# ?! ~& i$ ~* L& h
9 q4 X$ e) W7 M; nunzip -o test.zip -d dir #讲test.zip解压到dir目录, ~1 n+ n8 `* y7 Q+ x* E: u' e
解压包中指定的文件5 k1 N# h2 F4 x
6 q" W+ K2 v8 I$ @$ Y$ }如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:, W! Z f9 y8 |* h
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
& q; R5 y4 Y6 @5 yunzip -o tet.zip "*.log" -d dir #解压包中所有的log文件( \8 t" a9 Z: W. ?5 N- }
解压时去掉目录结构
7 I' z9 @; t+ e
$ b: \# }- C( L4 @压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:+ F$ t1 U1 o8 `5 b
zip -oj test.zip -d ./temp
& I& e0 j! B+ `3 z2 {6 I解压jar包. S3 |7 Y* X/ C5 w7 C; ]1 \3 {! E& G
- e4 I$ [8 v4 `) `. P" q0 x& K8 F D/ y
jar包是java归档包,但同样可用unzip解压查看里面的文件:" A/ g8 c- \5 M
unzip -o java.jar -d dir- I c( K4 Y9 P: U' ~
gzip% |3 H" c) o9 k1 m/ i" ~! Z
* M3 }7 q8 Z# x- P$ t& E
涉及参数说明:
; A/ r1 v5 A6 \7 ` P. z8 \5 ?-k 保留源文件
& e" N% \6 I! B0 q9 ~: C- d" ^-d 解开压缩文件
2 z( i4 \) x, L; s+ E! {$ Y. R) R-r 递归处理,将指定目录下的所有文件及子目录一并处理
& r* a+ [- { l-v 显示指令执行过程( q% H* ]8 U: a; c, o7 P$ U
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
9 @& n. d6 O2 x$ kgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包2 @" j9 L( |7 e# r* r2 H2 O& n- |, ^
gzip -rkv ./* 递归压缩5 w+ s5 o. L( L& X' i
解压也很简单:' W+ ~% _3 ?8 f2 n# _& o
gzip -dv test.gz , M0 \4 v( a7 g' B
bzip2
8 F; U- F. p3 z8 `2 {& F) J- g: z; f3 k# q
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
' X8 q0 ~* ~) X5 n( ibzip2 -zk test #压缩test文件' z; z% C' [7 s( s' L# y
bzip2 -dk test.bz2 #解压
3 ]# c g5 A1 w) Frar/unrar6 L! T9 f7 X- f3 W; A
4 \# o7 Q: r& A; P0 q
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
" }* Z5 G( y; ]& Frar a test.tar test #将test文件压缩为test.tar
/ r. l! A! ?9 urar e test.rar #解压test.tar# g3 z3 l- v+ Y" l7 X' Q6 j
unrar x test.rar #解压test.tar* V) J9 i% j( b! ]
压缩率比较
$ m8 k, a! f" `9 P* U8 e& F; Z( @ H5 [; K) J4 v% W' Y' U
压缩率一般来说:
% v- ~& q4 ]) Q u7 N- Ktar.bz2>tar.gz>zip>tar3 p9 J+ a' q' {9 Z
压缩率越高,压缩以及解压的时间也就越长。
% v b- n, s1 v" G3 f6 p& c总结
9 E0 X7 m3 a" J" u6 ?* E" i
- F) L I! ?0 F# ?6 U% ~对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。8 g5 @! f, M/ E7 C
有任何补充或建议,欢迎留言^_^。
5 K0 D& B ?" C+ {/ |7 D7 Z+ t/ {2 T) B- _7 A4 d( T/ ^* }! T7 Y
: _ ?: t/ M; I0 [6 Z& h" R( b: N4 c% _6 ]
4 Q6 {5 }# s: r- B! ^, I
|