无忧得胜-网上国际课程 (5edu.win)

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

& t( U# d4 @0 v! k" A. z
3 _5 E" i' \+ I: X' M9 c8 u2 H
) B* l8 {% j, V5 t8 [1 t
前言3 V: Q- {( e: |* U) s  a
  _8 v- B3 L& b7 M1 Z9 v0 o  Z! G
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
7 s* i" z/ p2 t) [tar4 Q( f' `  {+ @$ g
1 l9 c' o5 }  e) G9 j/ }
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
' C) h# F. L) C- O6 j涉及参数说明:

$ `) }  q1 z( r0 k# S-c 建立新的压缩文件) E  q  B9 ^2 @  y; r, G( |/ o
-r 添加文件到已经压缩的文件
' ~. t% Q7 Q% U- e! @. ]. O8 W-u 添加改变了和现有的文件到已经存在的压缩文件
' M3 ^$ b  L; q. T! Q9 C, q( e# J; I-x 从压缩的文件中提取文件+ R9 I$ Y9 h! ^* ?/ S- v
-t 显示压缩文件的内容% I# Z' T/ l# I" u9 ~7 {
-z 支持gzip解压文件- }, ^% S: Y# Q* b+ l7 g1 |1 q
-j 支持bzip2解压文件! O$ [4 a9 d, L- X/ J0 X0 y; M
-v 显示操作过程% w6 U: ]: w: Z' }7 p& B+ @. g
-k 保留源有文件不覆盖
  h4 h- H0 Z& v( P" ^$ B-C 切换到指定目录' O3 u2 s' M% S
-f 指定压缩文件
4 S. u3 n; L) U5 ~1 h- L, X, ?  y. u* L5 l) v
--delete            删除包中文件
! n$ q3 m" S/ `" s) }% n+ M--strip-components  去除目录7 L- S5 z& v5 h: |
--add-file          向包中添加文件
7 B& E3 t+ z0 O: P- g9 r( W$ i压缩
, ~( W5 o, b- R) Q% R" l- f& P7 U4 |  ~$ {. n1 z) y
归档tar包,不压缩
- a" i- d5 ]# ~9 M1 o
+ ?: T, @0 ]. g0 z5 o9 atar -cvf test.tar test1.log test2.log #归档多个文件
! T7 M* u$ ~3 Z: o3 U" ^tar -cvf test.tar test/*  #归档test目录下所有文件
& `( v1 O1 P- [; h% M0 atar -cvf test.tar *.log  #归档所有以.log结尾的文件
+ {. L9 z8 s& a' Z由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。0 |4 D( J+ g' l1 I+ R: E
归档并压缩为tar.gz或tar.bz2
- q3 c% {8 i9 H" N% j8 Q' d7 I. L
这种方式打包对文件进行了压缩:5 F# I$ \) Y# p% D5 B# w% u9 }: D
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
( n$ u  |5 f& l9 c, S1 ltar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
& J$ {! h% [: n% z8 w0 Z查看压缩包中的文件
% X8 I. _' B, c2 Q2 d
$ l1 ^$ L1 ]; @" Y$ a如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
$ o4 s0 h! e4 Gtar -tvf test.tar #可查看test包中有哪些文件
* l  o# o, x9 \  Y7 [打包后删除源文件; f$ M8 T  l$ i9 `

; ?$ D6 D( \' p0 ]6 B. M有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
# V9 |. l' E; a1 B7 ^& n" Ktar -zcvf test.tar.gz test.log --remove-files 2 {# Y" S7 ~; m& j2 |  J* `
打包除指定目录或文件以外的文件8 [/ x3 x! v0 _

5 `' b( L! g1 L: n2 r/ t! z对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:  q8 n  e& C/ g3 K4 Y. a
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
- e6 P. J& M6 T3 e5 u这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
$ p3 @  B1 n9 o4 z. M向压缩包中更新文件
/ H6 C3 I; f$ m3 h  ~$ X
6 u! H7 N) Y3 w# c4 x例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:) x8 Y: }1 [- M, o% j; V* b8 N
tar -tf test.tar --add-file=test #只针对tar包; c: C- @7 E5 J6 s! {* ^7 x
向tar包中增加文件# n  \5 f+ ?, a$ r* {  m

. @/ q$ i; e* w/ h7 d' ^向tar包中增加文件可使用-r参数:
* p4 m" k% }& \' t; e( |2 i- x2 Gtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
, A5 r) X$ ~. w/ D删除压缩包中的文件; m. R  y$ }5 b
' w( ~9 h, t- {
在不解压的情况下,可使用--delete选项删除包中的文件:0 r1 C' }1 \& I: g* n! \
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
' W) Y+ a! B% A6 z- ?. V/ ?8 ?$ K解压% v. k5 q- n8 G# E

4 p9 ~+ g. M. Z) C解压tar.gz和tar包到当前目录
6 A+ y. m9 y: w0 Q  \6 I6 p- C! W+ N  i) D# u$ q( [* |1 E  j
tar -xvf test.tar.gz
6 D7 o0 F: R% |tar -xvf test.tar 6 P( s% P7 L# E7 B4 D, C
解压到指定目录
) o5 V, C' S1 j. w0 p; I) `- C
$ r% R! Q) ~6 c* e3 mtar -xvf test.tar.gz -C dir$ v* _4 o9 _3 _, Y# U% i
tar -xvf test.tar -C dir
0 \! q6 d( I% v  }6 @/ g0 ]7 A! s解压包中指定的文件( u  c0 h! k1 z# s4 k
# B2 f- Y5 c8 o
例如test.tar.gz包中文件情况如下:7 x1 z" `# {, T0 c  I
1.txt
, A/ u/ R! d' E: tlog/7 t# C4 W0 r) i
log/1.log
  x) z! Z1 x! h. D. Hlog/2.log8 d6 n1 b, g9 N- v- l% I$ o
log/2.log" T) c) X' j# M4 s' Y4 K
log/4.log9 u+ J; o5 M# O  K6 p0 W) ^1 e
log/5.log9 V8 b7 G5 J* ~
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
5 b! W& y) x  Y% A# Htar -xvf test.tar.gz log/1.log
) _  {/ p4 q9 J" a6 `tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
6 `! [3 ^0 y' ?% H7 z# V解压时去掉目录结构
6 {; ^2 J+ I6 J8 n( e
7 a( X% ]/ o  n* c4 I# g压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
; N: g' K# u" ]9 |tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
! G7 ?* r; P8 k解压时不覆盖原文件
$ M5 t* Z% U5 ?
+ ^4 e, v% g8 J4 r0 v当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):( A- D* y6 c- @8 f. n" a* V
tar -xvkf test.tar.gz
/ M4 i+ R' I; y$ ~0 S特别提醒" ?6 w! _) q( H/ ?0 c8 |3 S- r

. L( ^* _; Y+ I0 S* j+ }前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
6 d: n# V: @4 ?" a* C0 K% y8 c$ Szip/unzip2 k$ P6 A0 @+ S3 b2 H) i( u4 P

3 r; k$ i5 n9 }zip和unzip命令主要用于处理zip包。
& {. T4 g$ H; d" ]; u; e+ A5 m6 F压缩
; R- |1 ]; g, W$ a; k/ P/ T6 r+ g7 l6 f+ V
涉及参数说明:$ q8 t4 R; s1 t, b1 U, }8 Z
-d 从压缩文件内删除指定的文件。
8 L7 v1 f; {& `: Y& r-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
$ g% B# S1 S& ~0 o( e1 s! _* }-j 只保存文件名称及其内容,而不存放任何目录名称。: B% e  D0 w& n4 E5 [' I  W; Q% G
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
, ^- }# ?6 k0 w0 a6 e-u 更换较新的文件到压缩文件内。( d& ?' O! |9 u, @
-v 显示指令执行过程或显示版本信息。  Z7 }5 c; j5 W; Y. g) u
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
7 J1 H( N5 h' ^2 n, ?8 R& a- <压缩效率> 压缩效率是一个介于1-9的数值。& o4 C- T' E$ k/ u; t- X
压缩文件
( j, W( Q9 a, u9 J7 t: `  Q# ~& i2 H
! ]7 c# p! X) s( Izip -r test.zip test/ #打包test目录下的文件, C6 h- [3 |: e! f  v
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
& Z/ ], y) Q- G) h! [指定压缩率打包文件
. m* z& y/ p2 l9 J
, _( O/ A1 V1 y  z' O) V2 p3 Nzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
% K4 Z. T5 a7 i! s6 c8 e打包符号链接文件
! ?5 F. s) ^/ ]; l
' `5 P5 |  s: i( D  }, Y4 i4 B前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:* m* R% }' J) j9 t, U
zip  -ry test.zip test
- H8 q0 l; l# @8 o向压缩包中增加或更新文件- q+ v4 U/ p/ P0 K( @

9 L2 U( k' e$ s" ^' e有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:9 j' k; p" J  J: P1 J8 r1 M
zip -u test.zip test2 #向test.zip 包中增加test2文件* g8 q, [+ j. m* W3 ~( u9 y# z' l
压缩时加密" g, M- p4 o- {  C% @. h- e8 ~
- I2 ~4 F# a2 i  y1 L, A
压缩时如果需要对压缩包进行加密,可使用-P参数:* Q& A1 z, p& H
zip -r test.zip test1 test -P 66666 #使用密码66666加密
: }, _4 W+ i4 L* S; ^: M删除压缩包的特定文件7 \2 O! M5 _& i; ]: c4 Z! C5 ]
; R) d& t8 t$ w. h
zip -d test.zip test  #删除test.zip包中的test文件- D1 b  z& g  a, _  f8 \/ k; W
解压
' ?, t) k& r. F
. ]6 [" Q, [9 m- Q+ _7 g* B5 i6 d涉及参数说明:; v+ _5 `/ R5 m6 c" z
-l 显示压缩文件内所包含的文件9 a1 ?: B6 c& L# e, B& ^) ]
-j 只保存文件名称及其内容,而不存放任何目录名称。% Q% o) m; p/ P$ G# k: [. ]  q
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该2 a0 c) p3 f# ?# [+ b3 O
-v 显示指令执行过程或显示版本信息。0 V/ ]  z) A, Y0 |
-d 指定解压目录,目录不存在会创建, i, c0 `: m" u
查看压缩包中的文件信息7 x' G- g& J2 y8 l3 n! M
' r1 T! i/ W3 i3 m4 S
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
) T! c1 K2 Y  i, _4 Y/ sunzip -v test.zip #查看更多信息,例如crc校验信息等9 J+ d; r+ ^' R* q( \
解压压缩包3 E4 f) `  X& b9 r/ l! g+ Y

1 X: z  c+ M4 g! W/ l! dunzip -o test.zip -d dir #讲test.zip解压到dir目录) W& i/ S2 C% J& W
解压包中指定的文件
3 Q, c9 [2 A* G" N' E0 w: ^' O3 y
" ], b( B$ N4 a& y2 `- h5 H如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:+ |2 ^7 y, z) H
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
6 V/ Y" @* R: z) }unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件, h# L: ?0 z3 U) f! _6 ?
解压时去掉目录结构6 b1 V! H6 G$ F- J

9 v2 ^0 ]! J+ a4 N( c: ^& {8 D压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
) n3 T5 C& @/ v9 ^+ m  j" yzip -oj test.zip -d ./temp  
1 V( U% z7 y/ G6 w解压jar包
9 C4 {5 B% ^$ S; A% L% L& i& s
7 N- C8 J9 H' Ujar包是java归档包,但同样可用unzip解压查看里面的文件:* S1 W; I+ v: C4 X
unzip -o java.jar -d dir/ b% y+ k8 @5 Z9 Z! }
gzip4 @& w+ V1 n: l$ B4 Q, ]

: j# Q$ }. o  f( B& d  B7 n8 v涉及参数说明:2 B4 N: u9 ?7 s; o: ~- S9 N
-k 保留源文件7 ?0 }  [' \& s2 b: Y; c
-d 解开压缩文件! N# ?. k: a% d
-r 递归处理,将指定目录下的所有文件及子目录一并处理% ^. U3 z; Q" i# Z  [
-v 显示指令执行过程
" B" ~% q; K! X  l3 jtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
. h' N' ]: R4 b' t4 L) {' Lgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包( z. K* o; S& F* G' T3 T
gzip -rkv ./* 递归压缩0 T$ E1 E( u  N& ~. [' P
解压也很简单:- |' w. P+ j" z9 S3 C5 `
gzip -dv test.gz " b8 L- Q$ b/ l0 X9 z$ B  k  b6 C' [  i
bzip2
8 v+ B4 z0 g) Q# l  v( n) Y& i" h( f( f1 x1 r. c
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:: G  f. q$ W5 M" W. K! E
bzip2 -zk test  #压缩test文件5 e) L; F8 v2 _! U
bzip2 -dk test.bz2  #解压4 J, y/ ^$ F3 F/ y. e
rar/unrar( |4 X+ P  l( z0 q

" h9 T/ `8 S7 M; n% U. ^rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
. w, D7 E2 q& Y( S1 C6 }6 s# d8 erar a test.tar test  #将test文件压缩为test.tar0 w7 g; R6 V/ `9 z& f) y* q
rar e test.rar       #解压test.tar8 _, q1 ^* b" t1 P
unrar x test.rar     #解压test.tar. m1 e: q" g- Y
压缩率比较
  @7 X3 S- r) ?' z+ J" {4 N% L% U  k7 G% l4 b  R" T
压缩率一般来说:
& b5 O3 A/ ^( O( {tar.bz2>tar.gz>zip>tar
! q8 k. m# K0 M9 ]" d压缩率越高,压缩以及解压的时间也就越长。9 H: T* T( @, @$ j
总结
& d2 u& O) C5 U& ~. S  v1 {* n/ a& Z5 m' p& S
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。3 J1 b$ \& T1 _5 b' ?- y
有任何补充或建议,欢迎留言^_^。& v% `! a7 X4 F! @' g+ K8 V
5 j  b! M4 n- k, d) i

( S2 N$ n/ q& r/ U0 i# c
8 j6 j. x" ?% ]" n( ^0 J9 h
  Y  u/ g7 e* `+ V0 ?0 {( ]! Q- ^

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

浏览记录|手机版首页|手机版试卷|使用帮助|无忧得胜-网上国际课程 (https://5edu.win)

GMT+8, 2025-11-14 14:02 , Processed in 0.067335 second(s), 32 queries , Redis On.

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