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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式

' l5 ^, D% v& k1 R5 E. P2 v
; w6 z+ j& Y9 q8 x
% M1 q& P2 m- K
前言, ?2 l. G6 ?6 ^2 \
5 q( x, {! t% M9 ~' a' s1 m
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
8 |# D6 V; x. P5 R9 u- Ftar' d$ u* o. B0 M$ E' g8 t
' X- I& j$ G( J  D' ~
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
$ N& w! w# Q5 w  H! ~涉及参数说明:

1 U+ Q' p( k, S$ a$ }; k8 z-c 建立新的压缩文件
6 e3 v0 a% m. M& K# i4 }-r 添加文件到已经压缩的文件
: j8 L6 O+ r% V+ t% @-u 添加改变了和现有的文件到已经存在的压缩文件
! C8 z# }% T3 ~" I; k0 k8 c-x 从压缩的文件中提取文件
) @# T3 D" F+ ~, h5 A-t 显示压缩文件的内容
2 @/ D+ @9 \2 Z' v0 v, j-z 支持gzip解压文件3 \' T+ ~: @6 @( q+ G7 G; M4 _
-j 支持bzip2解压文件2 w5 @% @7 l( E4 h) e, E; ~: W
-v 显示操作过程
) h4 ?6 A0 w5 H+ k4 i  s-k 保留源有文件不覆盖& I3 q6 P- N2 e
-C 切换到指定目录
0 y6 V: c8 w) Y# a-f 指定压缩文件& Z8 v2 P4 c( f& c3 H! S
, G3 L' R9 B9 R- w8 T, g) G
--delete            删除包中文件
: n1 C7 r. I+ O" }--strip-components  去除目录
, h; G0 ?; |1 C6 x7 P) n--add-file          向包中添加文件
5 V( y- T" A( Q' \压缩
2 y. @' s+ B5 n# n4 |. Y9 z1 B. w
归档tar包,不压缩
4 m" ~( Y; T9 o2 j/ o& o' B# ^1 q, u9 m: |6 j/ ?5 [6 ?/ ^1 n
tar -cvf test.tar test1.log test2.log #归档多个文件/ J. y' h0 U  c/ b. I
tar -cvf test.tar test/*  #归档test目录下所有文件% G( h' M, F" m# _5 b8 X# E
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 " ]* x- D; I. t. l! N
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。. P# t  s( U3 D" ~
归档并压缩为tar.gz或tar.bz22 w% e! w1 \; e
9 \( `1 E  Y6 h( D2 L4 m
这种方式打包对文件进行了压缩:
- |: j/ x' d2 S& O0 V: X- `! Q' v% t- ytar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩/ k5 e8 n! J1 o( Q( d4 T$ z
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩0 Z+ n6 m- E, n! J( o- S
查看压缩包中的文件
& }. j+ Y& f# i  S
! y0 ^0 z& A$ ]" Q& q1 U如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
8 }8 U- |) G5 b  Jtar -tvf test.tar #可查看test包中有哪些文件- R' l' O3 Y. p! p; g8 x
打包后删除源文件7 s& E: d1 H" V, J/ |

& x" q+ z, Y7 A6 C! I% u+ R有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
) H) ^  V- _) c7 u+ d0 Star -zcvf test.tar.gz test.log --remove-files * [* K/ z* ]  q: r6 P
打包除指定目录或文件以外的文件
7 v) l& q; D, f1 h1 ^; }+ a( ]$ j( B
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:8 n6 f0 S0 m" {& ?
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
1 }6 K4 l2 a( o* b" `- a% Q- F9 o! l这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
. G# ^2 B" D5 {# i6 _& }: q向压缩包中更新文件1 Y* n# [. Y# l% B; u
! h$ o9 T' Z: {+ ?( L) ^
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:! b' `" ]  j! k0 B+ t
tar -tf test.tar --add-file=test #只针对tar包- \5 W- X2 K5 }) E- q4 J
向tar包中增加文件3 J5 Y, r7 U7 P9 Q+ h
+ H: M0 w( u: M" y
向tar包中增加文件可使用-r参数:  U, A0 O1 g) D6 f" m9 r
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
/ P# K6 M: E! c+ f7 M) I2 n6 B删除压缩包中的文件
5 R7 e, {! S; D0 W4 S( Z
0 T) _; d3 [9 u4 I/ s) c! O在不解压的情况下,可使用--delete选项删除包中的文件:9 t( S* u: c) u. [2 @4 r
tar --delete -f test.tar  test1 #从test.tar中删除test1文件; o' e. V- ^( o, P" e+ Y# E
解压
, x" J( S: R$ P5 q- X- B3 m! Q
. _6 o0 v& L( [3 _) t0 N# b3 c解压tar.gz和tar包到当前目录8 K1 r) w7 s( I# o. D

5 Q9 W& k; l3 Ltar -xvf test.tar.gz" I! v7 r5 ~% r
tar -xvf test.tar
5 R7 P4 p( z6 t: t解压到指定目录
8 o( s  t/ a2 {- X* ?# X7 k3 g1 z& A
tar -xvf test.tar.gz -C dir1 z5 J  H' E. x2 K4 W
tar -xvf test.tar -C dir
' h: _& I" j9 k2 B2 R6 g解压包中指定的文件
! v( O6 t0 A# Y9 @
( A  M* `7 c6 D( X2 e; F& [例如test.tar.gz包中文件情况如下:
, c: l. R6 ]. A) a9 B! L1.txt' h$ E% u& t" H/ I4 Q
log/, m4 K! M4 d2 b" T
log/1.log8 X  F  ]5 H! S4 g5 Q6 p# S% z
log/2.log4 D/ l& T8 A- j% k3 U4 U3 T
log/2.log
, w, n" h% N3 I) Alog/4.log
4 F6 a7 [# E) b5 Z) `' }- T& Flog/5.log6 v$ p/ \) A1 Z7 z) h
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:1 z5 p. Q+ r" F9 H" X1 l$ B% z
tar -xvf test.tar.gz log/1.log
2 l  \# g4 H# t% n4 Mtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
7 M, q" d( S, @+ j解压时去掉目录结构
, T0 Q' z; ~) y4 z2 s* a
. p3 ]- C8 I' K8 j' x5 X压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
3 @2 ^7 m' j9 o3 Htar -xvf test.tar.gz --strip-components=1 #去掉一层目录
- K' G/ z- m% O5 i解压时不覆盖原文件8 P4 T) P9 `1 t! N

9 F9 t  u$ z0 b, y  i6 q1 B5 T( D9 m当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
  d  O, @+ _, J" V0 Utar -xvkf test.tar.gz
' I+ y- W+ w0 G) _7 h% t特别提醒' `4 S2 }  ]9 R$ S9 r) O* z8 J
) v$ x) e- H3 c
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。0 N4 D1 b9 n) ^9 W
zip/unzip
* N# ~* Y) y, G1 `! v; p
+ J; I& n1 r/ M) G& N0 N4 C- ]zip和unzip命令主要用于处理zip包。
' @. `9 l! R+ s1 h* j$ S压缩2 ?* F  ]$ m9 z

' x. [7 ^- w2 l6 e涉及参数说明:
2 _& S  w/ F( F1 C  b6 T-d 从压缩文件内删除指定的文件。) W4 J4 {/ a) m: Q
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。  ?9 z# K4 [- Q4 Y# f, V1 r/ Z
-j 只保存文件名称及其内容,而不存放任何目录名称。1 a2 s2 P$ P& |2 H* z/ C
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
1 h. U2 C7 ^) L0 X9 G. m-u 更换较新的文件到压缩文件内。$ o: `7 p& c: R+ E3 Z1 \
-v 显示指令执行过程或显示版本信息。2 E5 l% M. G1 J' w
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。2 D' a+ Y; C" f3 f/ E$ o
- <压缩效率> 压缩效率是一个介于1-9的数值。
( U2 N! u" o# C% n6 b+ q  Z压缩文件
4 v+ A& Q. Z) f, s: L) H7 J; B- \' ^1 `
zip -r test.zip test/ #打包test目录下的文件$ m! e; L/ i  w" F- P9 U
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
; `: P7 Y  K- `& X/ |. Y3 U指定压缩率打包文件9 r5 `# i4 U! E5 Z4 l! K
+ m1 \4 C8 \6 u+ A' @* t
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长. P7 ]- _. n- ]% [( i/ K+ D* b) n
打包符号链接文件
- S1 @5 y& y5 ]) b  U: \
0 {( [9 G" H# K  G( F前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
0 r& T- O" X6 r2 g0 szip  -ry test.zip test* Y* C: L, p; S+ r7 Z
向压缩包中增加或更新文件
8 l4 U' W$ H: L
  Z" W3 C$ M1 F/ S( L有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:3 ^; f9 f: r$ H& X/ Y( f
zip -u test.zip test2 #向test.zip 包中增加test2文件
9 t' e& l/ Q( C+ x压缩时加密* V. Y/ O: }' \

  b3 Q' C5 T' v/ p压缩时如果需要对压缩包进行加密,可使用-P参数:
4 i& q6 X- a0 p/ w" g2 |9 p! t2 d5 x" Lzip -r test.zip test1 test -P 66666 #使用密码66666加密4 A% R+ a0 `( F, L2 m$ f: ^& u9 Q- a
删除压缩包的特定文件9 |1 \( k; v; V& P6 R  [/ ]# s

7 y6 [4 F# [4 M2 C' E) ~* W  |8 gzip -d test.zip test  #删除test.zip包中的test文件& @( C  ]: x7 b- J, \) W  F
解压0 y3 C6 B& F6 H: S
9 V5 u+ P+ Q# D: y/ c
涉及参数说明:
# W: b+ ^& _6 }  x) i4 [  E. r2 U-l 显示压缩文件内所包含的文件; k, ~. `9 i6 `% T7 o
-j 只保存文件名称及其内容,而不存放任何目录名称。$ H1 B9 z! q" L" e2 m
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
2 B9 G: d8 Z8 z/ p-v 显示指令执行过程或显示版本信息。
8 K$ W( S% p! T; r/ Q# u1 }9 O" R-d 指定解压目录,目录不存在会创建
7 N0 i' H2 o9 P查看压缩包中的文件信息: _$ ^0 p6 K( R! B" ?2 I3 e

4 |" Z8 x& O( j% B" w1 ~4 bunzip -l test.zip #可以看到压缩包中的文件名,日期等信息2 D( v+ y) e: ~9 y  @9 v4 \
unzip -v test.zip #查看更多信息,例如crc校验信息等
( g& v6 ]0 d0 O( u7 z; y  R. s解压压缩包
; d! @8 {2 a8 g" K( `) F  B$ T9 ]* W  q* p
unzip -o test.zip -d dir #讲test.zip解压到dir目录
' ~7 P  S. J  n  T9 q0 n解压包中指定的文件0 c: z. X2 x7 x- s3 `
# [+ K" Q5 x& `" U
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:. [, }7 V' _, c0 Y& _! J# L6 Q
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
5 R) S2 e3 p! Funzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件! r5 S2 p* \- m+ ^5 D+ g
解压时去掉目录结构6 s: _( C8 \6 s1 Y3 j
6 s6 \' [) H: F4 A
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
+ w) N9 h/ u4 n2 fzip -oj test.zip -d ./temp  / ^2 m/ q: p* u2 g: h
解压jar包/ [" [' j# ]- N

7 ~0 q# z2 q/ I6 G+ Q$ @, \5 Y% m- [jar包是java归档包,但同样可用unzip解压查看里面的文件:8 z  Z6 E. P5 M9 \0 V6 ~1 I" o, g( R
unzip -o java.jar -d dir
7 c3 L! h8 ?( X" ?. s: R" z: hgzip9 O0 o7 t* ^' D$ r

  G: [2 R. o' \2 L# Q& E% J, m涉及参数说明:
/ m1 Q5 A2 E1 D0 q-k 保留源文件+ W! s2 y. z* |
-d 解开压缩文件5 e, }6 c$ i0 H. ~* l# s3 h
-r 递归处理,将指定目录下的所有文件及子目录一并处理: E' D5 Q4 B5 \: N2 B
-v 显示指令执行过程) A+ {7 g* y' r6 {" I# Z/ n4 l: G
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
3 Y' a& f! i8 l1 N% c% egzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包' l* X0 v3 \# y- z9 x% z6 P
gzip -rkv ./* 递归压缩
: C; v+ K9 T; v5 p: I8 g解压也很简单:2 s5 C# m' f  F  `9 x
gzip -dv test.gz
1 z' b. i* g% i. w6 p5 Mbzip26 n2 n, C; J8 N! e6 Y6 G

0 X! E/ e" M2 p) g8 a1 W1 Ytar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:& Y2 e1 `. B( G7 C" K5 i
bzip2 -zk test  #压缩test文件+ n4 D3 u8 Q$ O$ t5 x. D9 [
bzip2 -dk test.bz2  #解压
7 y! l! J$ z( Orar/unrar
" S+ {  {# j8 D2 L) N( S' D- Y, m+ ?3 y2 Z' i8 ?
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:/ \0 W$ y, d' r4 l5 ~
rar a test.tar test  #将test文件压缩为test.tar% |/ p; }1 i; Q( [4 k
rar e test.rar       #解压test.tar3 E; X7 l. s! F  o2 S" [$ C
unrar x test.rar     #解压test.tar) m4 `# V# C: C0 d7 C9 ]; p) t
压缩率比较
' S( n7 P, E2 v* b6 K- D  [8 x! I! T6 v) m9 l5 G( E( N
压缩率一般来说:
# _/ P" V. J) `1 jtar.bz2>tar.gz>zip>tar
0 w! t+ o* i0 F4 {% A2 P$ H! Y压缩率越高,压缩以及解压的时间也就越长。
$ R5 M3 Y7 d" Q2 G; Y! Z总结
8 d, k, E% N0 f% T
1 W0 x" C2 S4 `) O对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
: }3 t& Q/ W2 c- k& S3 Q* K有任何补充或建议,欢迎留言^_^。% l# k3 c+ }* O4 p
0 W' v5 h( E: Q/ {1 x
, D# z7 T3 \, i7 f! F

: J9 J+ @8 i+ g3 ]9 l

3 \8 u1 e" C+ D7 V" _  d( U

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 03:52 , Processed in 0.059967 second(s), 33 queries , Redis On.

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