51fly国际课程 (51fly.win)

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
. ~, g8 h2 ~  O, ~7 V& u# K4 Q
6 J0 l4 j, \: ?4 Y. w8 g

5 F% h2 [4 l$ D% e+ ~: K前言
3 H% F8 U. b- m
* P. E% g5 t& J. m; aLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。' x, a8 n3 w& ]. c# V
tar# u3 ?/ x# d4 e: Q

' a. V2 o. l/ ^tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
" Y5 k( v2 V8 b涉及参数说明:

0 @+ e/ g0 M% W! }" b% V-c 建立新的压缩文件8 m1 H, P9 ?# p1 i
-r 添加文件到已经压缩的文件0 z, S  _, ?. f3 _+ l% K) Z
-u 添加改变了和现有的文件到已经存在的压缩文件1 {' s& w5 j, T8 i3 Q: x$ n, P# y+ ]
-x 从压缩的文件中提取文件
$ V" j) V& H; ^-t 显示压缩文件的内容2 l& [% t5 x8 V! z+ [
-z 支持gzip解压文件
/ Z9 [/ J) I4 K$ V/ V1 t( P. {-j 支持bzip2解压文件
* F, `# O$ k: Y3 C5 ^- X-v 显示操作过程6 y% w' w; j# N/ n
-k 保留源有文件不覆盖
4 g& w3 ^- B- e, d' y  m-C 切换到指定目录
9 `% a9 @9 \" w" I; K8 u1 Z6 ~-f 指定压缩文件
$ B- d' i9 U" v) u) I5 O- n2 J' r  U& K9 ~5 U! ^; W; V
--delete            删除包中文件# U8 F4 E- A, K' b
--strip-components  去除目录
: f" k! D+ g# g: S) \  Y--add-file          向包中添加文件
1 a, L& y3 N) k9 M压缩& ]5 c/ T& ]6 |

3 D0 i1 v! x$ v  W* z$ C, |归档tar包,不压缩
5 Z, x# R4 P9 A3 w( V% @
9 L* X' D, J$ c: P, g/ Ttar -cvf test.tar test1.log test2.log #归档多个文件
+ k/ j5 w8 y1 a3 ^tar -cvf test.tar test/*  #归档test目录下所有文件
+ J+ g4 v* q) etar -cvf test.tar *.log  #归档所有以.log结尾的文件 ( Q: j7 n9 K0 K8 T  l# X
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。6 _( p7 ~' D( Z- _/ }+ [
归档并压缩为tar.gz或tar.bz2& c# s$ U3 P/ N% a/ ^

! F, B9 ~& `# _7 {4 i6 H: q' ]3 g1 U这种方式打包对文件进行了压缩:
: |+ P6 y7 Q% N/ ztar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
8 I. S. V6 D$ t% z5 Ttar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩0 x$ s0 P, i& L2 r
查看压缩包中的文件) Q8 b0 R/ r8 H. ~) B

( V" ^1 f4 q+ }+ P$ [- O' P如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
* I" u9 z) c& c. {  W$ ytar -tvf test.tar #可查看test包中有哪些文件. O- s' i! s$ a% u: M
打包后删除源文件
+ t% V4 w9 Q7 b- d
5 o/ h: a' ]7 h0 Z有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
' p& i/ M" K. M4 O# ^tar -zcvf test.tar.gz test.log --remove-files 9 \" Q5 S! N3 \  l4 g4 O
打包除指定目录或文件以外的文件8 Q, q  R3 Y" @( _& m

& r2 q. }, n, g- Y对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
$ G: C" C/ E+ X' W) L  Q( I2 N4 {tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件: l* S, g% Q( ^/ v$ a1 G5 w
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
6 I: z. ]/ [. \) P向压缩包中更新文件0 T: T9 F4 ?! Y
' P* q  d. y( ~6 o
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:' Z4 U- {4 Y- |2 M5 H
tar -tf test.tar --add-file=test #只针对tar包
% N1 Y# z! W5 d向tar包中增加文件
; M- u! O0 j0 S1 F# S" h. F1 P' L; v
向tar包中增加文件可使用-r参数:' v1 r( k4 q- a9 z8 g% W% C
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
1 H: |7 Z& F# V& x$ Y删除压缩包中的文件
+ k) C: c( B: c5 v. T# z$ ^
1 V* U: j! N! b6 X7 L在不解压的情况下,可使用--delete选项删除包中的文件:+ @' W+ c7 H- _2 A( o& Q0 b
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
- }- D6 f0 \2 Z- U/ W解压9 m2 p, {- J2 [, B* d$ J

$ i3 R3 H3 o5 p3 ^/ Q解压tar.gz和tar包到当前目录
" }  o* k: P4 Y% }  f+ e& I5 Z" ?9 C0 m
tar -xvf test.tar.gz. G5 v. y+ s# a- j
tar -xvf test.tar
3 Q0 u8 ^( k  s7 G解压到指定目录
0 I* y* H3 p5 x! s/ \1 ?2 A% q+ Y  n* C% Q4 j( V. t
tar -xvf test.tar.gz -C dir$ Q! K4 I2 b8 o6 ]' X- c
tar -xvf test.tar -C dir. b( g: ~! t1 C
解压包中指定的文件) n& Q: q/ P2 x, W- c, a% R  J7 @! I2 J
$ K$ E4 C6 Z9 }
例如test.tar.gz包中文件情况如下:0 B" D0 H8 O' M" P" O. h
1.txt' i! p9 u5 B; U" R% d. L
log/
" ^2 d3 X' B) b! ]  {log/1.log
2 M9 F: t$ t# I! d: Vlog/2.log
' V" @: k& |$ e% llog/2.log* \4 Y' ]8 J& Y+ V- p! n% {0 v2 U
log/4.log9 ?- D3 o8 j1 s' p9 R0 I
log/5.log
7 |  K: G0 C/ Z& {如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
; d! G. Q: B4 N% rtar -xvf test.tar.gz log/1.log# w0 j3 N- H( e# k. J
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录* ^2 n/ w! Q0 W! f
解压时去掉目录结构8 d; F" j3 d) ]* M+ q+ L7 O& Z. s. e! t
$ V! R) ?- z2 ^: `3 c
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):4 [. L- x+ U' b& m8 w
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录$ W3 X' G/ ?* D  A# d
解压时不覆盖原文件" ?! s4 G. n* H

" W! u6 X8 X9 n/ N3 e0 e/ s当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):4 m6 g. n. j6 M. E& r6 d0 I
tar -xvkf test.tar.gz/ E' ?9 C% @" \$ n$ `2 F6 }: w
特别提醒
; Y0 f, `; S- S' \' L' m; u; K  v
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
2 k. ]4 P, d2 {' r+ \/ ?zip/unzip" e" g7 e8 Q9 ^" \8 C9 q1 |

6 n0 e2 N& R/ X, ?& s* u0 k1 K" Q7 e3 J& Ozip和unzip命令主要用于处理zip包。+ _  A' c( W8 o! L  z
压缩
4 k2 {9 w$ s7 j1 K9 K6 r* I- N
; N- A- V7 k1 {; `: {$ P涉及参数说明:3 v7 l% [+ S' X) U7 A) c9 Q
-d 从压缩文件内删除指定的文件。
1 H2 [3 A0 _, V2 ~5 o' {! f-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。6 k- v, [/ G# o2 H8 {
-j 只保存文件名称及其内容,而不存放任何目录名称。
9 V8 k9 p  C, v# c& ?+ V/ I-r 递归处理,将指定目录下的所有文件和子目录一并处理。
/ j1 U6 Q/ _. M* y: N! y-u 更换较新的文件到压缩文件内。
% j2 ^" m, g. T( ^4 L-v 显示指令执行过程或显示版本信息。
/ \- {( m" @+ P9 ~. R-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。! R; J" E  w8 `  F1 W  U
- <压缩效率> 压缩效率是一个介于1-9的数值。/ I, w" p( ^  x9 \' m! }( A( ~
压缩文件
) W% {" i5 k3 C# `0 s& K2 S& P% _- l3 l$ ], H$ h7 u" F( [
zip -r test.zip test/ #打包test目录下的文件$ b$ {1 |+ D! |) Q6 d
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
6 i! d2 W( i$ A# P指定压缩率打包文件
9 H0 Y8 T: {6 A
" d4 x. X' ?$ G- A  nzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长' }( ^$ [! A* B: }5 X9 N: S; m/ j
打包符号链接文件
0 U2 f: c6 O  q! l
, f$ I. i. R: e$ d前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:" c! y2 Y4 i! _6 b, Q
zip  -ry test.zip test
$ ~& `& b+ E) w! p: v* H8 Q& _向压缩包中增加或更新文件
% P% {4 v- z3 y5 t3 |4 Q5 U$ e+ P/ [# }! z  R& I' X
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
5 I+ q/ T8 d( ~! Mzip -u test.zip test2 #向test.zip 包中增加test2文件( K  b- ^1 j/ j3 e8 m! c1 ]
压缩时加密
; a/ w4 A( z' B! v" Z4 v
# D/ W8 S) c2 ]0 E压缩时如果需要对压缩包进行加密,可使用-P参数:/ i6 V5 P4 x6 _
zip -r test.zip test1 test -P 66666 #使用密码66666加密
" ^# V8 _# C0 p5 A$ }删除压缩包的特定文件
9 \3 _  M$ d* ^. }2 X& I  \
! g. T; ]; s: Ezip -d test.zip test  #删除test.zip包中的test文件
6 ^; F. G' ?& A" G3 ^$ Q解压! y; z$ [4 |; F- W8 ]$ ]$ r

4 {% w- ]$ C( \- |- d涉及参数说明:
6 K/ P: y* b# m3 u% Y- g-l 显示压缩文件内所包含的文件
) _  V/ J& ~4 R4 W$ E-j 只保存文件名称及其内容,而不存放任何目录名称。
% h3 @$ k9 r1 X-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
) x" k: Z  {" Z; ~-v 显示指令执行过程或显示版本信息。$ c5 l7 n- J/ P
-d 指定解压目录,目录不存在会创建
  b2 K. \: ~+ y# N* h, C6 @查看压缩包中的文件信息% r3 u( T' A5 b
% [2 \9 {* Y/ B- S3 `, l, U
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
3 ~5 b* x% H$ n& s% |3 Yunzip -v test.zip #查看更多信息,例如crc校验信息等
7 ~8 A- B# {' W/ c解压压缩包
9 X2 g% Q6 Q$ D/ n: w3 _
( ~0 k+ I& L: }1 i2 r8 d5 X9 Z6 N) }unzip -o test.zip -d dir #讲test.zip解压到dir目录( v, Z6 p9 ?7 o' q( S
解压包中指定的文件- ~1 D: h' P1 b. E& D8 I) I
9 h3 c6 ]; g6 \. d9 q
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:0 e2 p# Y, I* Q6 @& D
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录. B. U; i, s* F) w3 g
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
2 m2 o/ F, g* p( P解压时去掉目录结构
+ x! G+ \5 Q7 H5 T# m
6 c  ?+ `# R( a1 ?7 X压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:1 v# V( Q2 Y0 s/ j" c* W) x
zip -oj test.zip -d ./temp  
% [) t! R; e' _9 N8 K+ k解压jar包5 |( O; H' I: }/ R2 s# D1 Q1 ?

( O. ^- H2 B" m" Rjar包是java归档包,但同样可用unzip解压查看里面的文件:$ S5 v0 W, o! i
unzip -o java.jar -d dir
0 q. V. R- T( I+ }( bgzip
/ _2 b1 R& s: A0 r5 w* h. A7 P5 r+ F2 `* ]0 [
涉及参数说明:
+ U3 a6 z! a3 V( o; @-k 保留源文件
( c+ ^& N5 Z0 r-d 解开压缩文件5 \8 A; G5 M" G# }
-r 递归处理,将指定目录下的所有文件及子目录一并处理
; }3 w5 U2 M9 B4 H' b-v 显示指令执行过程- A: W9 N& n7 k: P7 W- M
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
) l) |4 A% y8 m5 z! _: }gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包& y: U0 ^) B# m+ ^& L
gzip -rkv ./* 递归压缩5 z6 o% B3 G/ \5 x7 K5 \6 x0 j6 A
解压也很简单:4 X5 T2 P1 l: B. r8 t
gzip -dv test.gz . s- B4 L6 P" c% D* }+ q
bzip2  V: c3 E" k/ B

4 _* u4 G# A( `; S; {tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
  g' \2 [6 I" n- ?$ Ybzip2 -zk test  #压缩test文件5 Y* b! r# o! F1 T6 M
bzip2 -dk test.bz2  #解压
5 M3 J  I) `/ U7 s: a) Crar/unrar
' e6 v% H! R0 t% I  ]. P" G. b8 e
% k2 t0 G) f. L6 a' f  x- d! Hrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
7 N  i8 |  e; f2 Q0 q1 s) U4 \* U1 _rar a test.tar test  #将test文件压缩为test.tar
( G, `, }0 Y! h- _3 Irar e test.rar       #解压test.tar6 f" u. u! r( y2 s5 g& z
unrar x test.rar     #解压test.tar
" P8 v, R# g& @! ?5 W1 j  G5 z压缩率比较
0 N$ U( M3 g! y# G
) h' P2 J) F4 a* A3 g压缩率一般来说:# v. @9 E% i7 }* t" e8 K/ H0 ]; \
tar.bz2>tar.gz>zip>tar
5 k' `, c3 W8 R3 u6 s  e压缩率越高,压缩以及解压的时间也就越长。
+ c% t  R; i- V, z总结
- ?7 M. f3 G' L& e$ n! h
  F; G) `! H9 s# u' {5 I5 @对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。, D& p" R5 @0 l8 g% k1 S) m
有任何补充或建议,欢迎留言^_^。' z- Q: S+ \% B+ ^  ?( b
; Q  I5 F6 }5 S8 |. K3 {
# `* z( i8 e% ]: o

/ o' C5 [- x5 q5 R1 y0 }

- K. }8 T$ H0 G# |

微信扫一扫,分享更方便

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

浏览记录|手机版视频|手机版试卷|使用帮助|51fly国际课程 (https://51fly.win)

GMT+8, 2026-4-10 06:26 , Processed in 0.060428 second(s), 32 queries , Redis On.

搜索
快速回复 返回顶部 返回列表