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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
# q) _, j# A) S& q# Q- |
' u0 M2 ]2 @% J. J* n

; U: b1 F& C# B1 H& a7 Q& e' `# r前言. e- q- O" f4 J& b/ u

7 @& A% F7 Z( `: o9 y2 R7 YLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。* H8 V8 o! g! M
tar1 U9 Q! l) }; C7 U- O, U( r3 s" q
4 U  {3 ~) r% F, e9 d, `, I
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
  n7 E: X& }  v* x$ R( M! l涉及参数说明:
  b) t. T$ W8 m' V
-c 建立新的压缩文件
  L  g9 i9 n* e( X* _- s-r 添加文件到已经压缩的文件
) w6 F& x  n, L-u 添加改变了和现有的文件到已经存在的压缩文件
  I/ [. ?# n3 R- I6 L' P-x 从压缩的文件中提取文件3 ]; V! w2 k" ~2 E
-t 显示压缩文件的内容
+ W. ^* G, B5 Q  J-z 支持gzip解压文件
1 ]( C! e! ^: g+ K& f9 r-j 支持bzip2解压文件
5 ~2 O+ N. `2 I$ A+ j5 S-v 显示操作过程
4 u) l9 r! k' F# N2 ^) V-k 保留源有文件不覆盖
- F- l2 U4 J) r) o3 E7 \-C 切换到指定目录% }( }9 g* x( u& h1 _
-f 指定压缩文件- v$ v7 {  @1 I" I

' K" w4 W' ~$ a! I) {$ T4 |--delete            删除包中文件( ?+ I2 h' b+ l7 ~
--strip-components  去除目录
( S2 `, P3 W# K--add-file          向包中添加文件
+ q( k1 J0 g6 x6 D5 y% l压缩; w8 v$ U1 Y+ |  y' @: z

1 q' L3 u+ c/ X5 M% `& S+ H2 R6 \. g+ d归档tar包,不压缩" y2 i- }- x; D1 F+ \* J$ b

6 Y8 m3 Q6 `3 i7 M" rtar -cvf test.tar test1.log test2.log #归档多个文件
9 R8 E1 y: D$ W  D" i3 f0 O1 Rtar -cvf test.tar test/*  #归档test目录下所有文件
; N# |7 u; X7 Q6 f3 N; Ctar -cvf test.tar *.log  #归档所有以.log结尾的文件
6 N6 {) J; d! P6 P0 G. d3 F由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
' {2 N: }/ K7 Q归档并压缩为tar.gz或tar.bz2
7 l- \% u, U/ p8 e
' J1 v* [3 q. O7 \8 [! T+ y! z这种方式打包对文件进行了压缩:
- x( Y% O. P2 wtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩2 L# d: T" L6 s" O: z1 _: t
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
; T8 U( a% a4 q2 K- D查看压缩包中的文件0 d) N* X, b( S

6 I! c5 a3 _$ H0 i9 K如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:( t6 Z) J1 Z) I
tar -tvf test.tar #可查看test包中有哪些文件% n; Z2 J( r5 B- A! k- i" g1 b
打包后删除源文件4 w( ^+ c7 p0 r" i! u  q; H8 [! l0 B
( a, m/ K# k8 I+ ^: d# M
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:: v1 {+ R; D2 ~8 W
tar -zcvf test.tar.gz test.log --remove-files
! @, _( F, R. w1 o4 P$ t' x, S; s打包除指定目录或文件以外的文件8 y0 {1 o! ^9 B$ e

- h& O4 H1 o! ~! ]/ |对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:5 F# ^( G6 H$ r0 \/ ]$ @! |! g
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
, Z& G. L" i$ Q& `; k( @$ |这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。; f; I1 E, N' u3 M7 y
向压缩包中更新文件& L/ m4 \6 z6 q) d6 x* n( k

6 _. y  ~5 O4 O' q5 S/ ~例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:0 \, R: c$ _7 o8 t. [; m
tar -tf test.tar --add-file=test #只针对tar包& C4 u+ U4 n' C- W
向tar包中增加文件
$ v8 E+ W3 H" s# n& o
% i* r4 I1 w1 O* R  T向tar包中增加文件可使用-r参数:) i6 {" n& F4 G6 v0 {) o
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar( z1 B- s5 f1 T1 n, ^
删除压缩包中的文件$ w1 U8 ^5 l+ F. Z7 ^/ s9 u+ F

5 F: C0 @( O" [) t  b$ Z# T, d7 K" v在不解压的情况下,可使用--delete选项删除包中的文件:
5 C1 Y' n# f  _& S% g- y- `8 B; S' Ltar --delete -f test.tar  test1 #从test.tar中删除test1文件
1 l3 n& ]6 f, I! S/ Q2 ^3 _9 a解压. s3 c1 t# F* v0 e% H
6 J4 A& D" w* h3 r" E& ]' b
解压tar.gz和tar包到当前目录% E4 Z8 x8 P# `) z9 T( M, f2 o% \

, p2 Z- h! O. E. `  }1 Ktar -xvf test.tar.gz
/ l% Z* O) [0 m( Vtar -xvf test.tar
5 c: ]7 @% s7 g/ D. a9 Q& s解压到指定目录
+ P2 o0 i" B: C6 `7 V4 X
7 {, M, w8 X- a+ Dtar -xvf test.tar.gz -C dir
: `, }7 A) |. v: dtar -xvf test.tar -C dir
% ?+ q* z0 N( O' }' |解压包中指定的文件
! O/ j0 s1 F' Q3 N* H& \0 W" x- M, y1 ], e+ V# W* V* s
例如test.tar.gz包中文件情况如下:# z) S" F5 l( e/ V: p* r/ _
1.txt
$ ~4 L0 ~0 C# d* dlog/2 f- q* `$ N2 z- {8 N0 I
log/1.log' u6 p) S  J' l5 |; t
log/2.log
0 [7 X6 A/ w5 ~: F0 W9 e- }log/2.log/ y1 Q7 x8 {/ l
log/4.log# X/ M1 j; _( U
log/5.log
, _- w2 r$ E; L" w, x- N& k如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
- c, I5 E$ s+ _, }. t1 Mtar -xvf test.tar.gz log/1.log
& Y, s* I& s% j" e6 G/ X- ltar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录4 u8 _; z2 T2 ~  [0 [' y$ @
解压时去掉目录结构/ M# V# U* I+ t6 n% \  M) d
2 Q/ ]9 M2 r2 \6 |
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):5 m7 `8 o& g6 G: {" _0 r4 _( t( N( M
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
1 f9 R6 E/ i% w& G解压时不覆盖原文件
1 w! a  G: F4 j0 {: V, ]
6 J7 C7 S4 x. r" k; y当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):3 c! q; P7 k+ y
tar -xvkf test.tar.gz
7 U! k: Z5 F# Q0 C8 w3 I8 ^  y' y) U特别提醒6 P. @; q$ M* A8 D* L; v! H( d- j

3 c6 a: _6 p" y8 A前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
& O4 w0 }8 @7 A; ~8 @. Dzip/unzip  y; N6 i- c% v! g, c5 i0 u4 E
$ b: B) r1 C$ v! z8 d& T: I
zip和unzip命令主要用于处理zip包。, W5 d' k" q1 C( ~  m2 R
压缩
& E1 O. Y$ [" C: V
+ _2 L) G0 l# ~* v3 O/ N+ Y4 y涉及参数说明:
- m) z  E& }3 ?9 H- p-d 从压缩文件内删除指定的文件。
3 H: J  B# G' u+ n, W; v9 J-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。% S# `4 G7 o2 L$ ]9 J( U" y
-j 只保存文件名称及其内容,而不存放任何目录名称。. e8 Q1 I% Q9 c7 m
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
6 v; T2 w3 W. s2 i-u 更换较新的文件到压缩文件内。
* n% H0 l6 e) h, ^-v 显示指令执行过程或显示版本信息。
6 z% i- M: I3 ^$ E" v/ X; l2 p9 l-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
" r' v2 l: W# E6 s! c8 A- <压缩效率> 压缩效率是一个介于1-9的数值。
6 U  @0 J% T) p压缩文件
/ b8 ?' w8 V. U! L" K- {4 x. _' c8 U) z' ]. v- S4 O$ E" _
zip -r test.zip test/ #打包test目录下的文件
+ r6 }8 ^& q8 W4 U# ozip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
: u# e6 k6 b, o2 k/ l$ w指定压缩率打包文件6 I; N+ @2 }0 d  b+ ~6 Y) q& y

3 x" T$ y" q) F# G3 bzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
8 S  }) g1 X3 j' _6 G打包符号链接文件
, T& n  y3 N8 B' P
1 X$ M0 T* S9 o  S4 p6 S前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:; t4 [" s; h' t4 S' V
zip  -ry test.zip test( `# ?" s# N3 K% S2 X9 q; T3 _9 j
向压缩包中增加或更新文件
& E3 ~, D; Q/ D
$ t! s4 N8 g5 N/ y有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
' ]( a! @2 D6 Mzip -u test.zip test2 #向test.zip 包中增加test2文件
' H& ?* Z; g4 J% t, K# i压缩时加密- r; c: z! P2 M2 c. z" i

/ B) O( K# v- Q  b压缩时如果需要对压缩包进行加密,可使用-P参数:$ b5 ]# K/ u2 y* j: i
zip -r test.zip test1 test -P 66666 #使用密码66666加密
7 [/ j$ z. J* l. U0 G5 E6 {删除压缩包的特定文件
% X  \3 J3 u$ ~0 K( m0 _+ B  W. |4 h& X" p. S6 \
zip -d test.zip test  #删除test.zip包中的test文件& h* F+ {- C$ M3 ^* F) |
解压
- G. k9 v: j* f6 j+ }( X& \  Z0 x5 Z2 `( X/ V" Y' B0 ?
涉及参数说明:
+ U2 T) ~6 @' x8 d8 \2 `) _-l 显示压缩文件内所包含的文件' ]( o1 |+ a1 j! Z' O/ Q/ Y/ k+ ?: w
-j 只保存文件名称及其内容,而不存放任何目录名称。1 q" W* G) u7 @. ^2 G
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
: m; h* G: {0 K- `9 _6 D" z5 q! u5 O! M-v 显示指令执行过程或显示版本信息。
9 O$ V1 U+ d+ Y1 }, i-d 指定解压目录,目录不存在会创建" L3 s0 J) j' S
查看压缩包中的文件信息
% @8 M, W. }: [8 t7 C* [
9 r/ w/ ]8 j) g1 R9 Runzip -l test.zip #可以看到压缩包中的文件名,日期等信息
  {) s% ?! t, c. q' \unzip -v test.zip #查看更多信息,例如crc校验信息等
9 |3 t: q5 E0 C- I7 H. I( c0 t5 t( z解压压缩包
. y" [( p% _( [3 `$ J- I) s* R0 r' V' l7 T9 {) e- H8 M
unzip -o test.zip -d dir #讲test.zip解压到dir目录5 {& x3 I: R9 [$ l# h
解压包中指定的文件  A2 C0 }" M+ ^( A4 L

% i. b5 f" [9 P% F% S如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
- y5 x1 _& ?5 g; T. j+ \4 C8 u  nunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录3 A, N" F! ~2 ^" p0 V8 M8 L
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
. Z* l! m$ |+ _解压时去掉目录结构
/ C. w8 y3 S- \$ m! ?5 x4 Q
5 D1 W' }' i* `* Q压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:( V0 F  r: @! L! m( u9 U4 E6 x
zip -oj test.zip -d ./temp    P; X4 E5 c2 v+ y4 }& N" j3 t' y
解压jar包
0 \- X: g1 @# J* M2 Z9 y6 X: s8 Q4 n! H
jar包是java归档包,但同样可用unzip解压查看里面的文件:2 A/ D0 F8 i+ G( j8 M$ M$ n
unzip -o java.jar -d dir6 ^# F- {, l5 R
gzip
2 P6 U* l" G  n8 w* o" }
0 P, {. ?) \- {2 p- I* J3 ^* h涉及参数说明:: w! Y# O) H1 L/ r) A1 Z
-k 保留源文件( `( B$ j" z8 I4 |3 i$ L
-d 解开压缩文件
. I; q9 n  o2 h5 X4 T1 E4 n; `-r 递归处理,将指定目录下的所有文件及子目录一并处理- I# E! ?# Y, v) ^; t  P
-v 显示指令执行过程% E5 q+ C; r' q% K4 Z) t1 O
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
  _( k4 u5 j( V. _9 p5 ], Lgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
2 f+ k2 e  {9 C/ ^: qgzip -rkv ./* 递归压缩% M( f, P5 `$ k2 {6 C( V5 c) j
解压也很简单:6 Y! `5 c: v( M, @$ U" |- H  A
gzip -dv test.gz * |- i# f+ S/ Y5 d7 j6 e6 {
bzip22 @2 ]3 }1 k1 [/ D
2 F$ r& U( \9 \0 A% ?+ @
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
2 t) C8 ^3 j$ |/ v) ibzip2 -zk test  #压缩test文件
9 n+ ?/ }: B  h! U2 Fbzip2 -dk test.bz2  #解压& b/ S$ d( ?% W& J! B
rar/unrar; Y1 O  U7 R& p) L! _) x
) m2 _/ X) {0 d) A3 b2 x" K
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:- N5 e. Q6 ^: Y& |+ B5 Q) U$ D# ?
rar a test.tar test  #将test文件压缩为test.tar
0 a8 |1 Q& Q# U! r( {rar e test.rar       #解压test.tar8 S4 V4 e" Y& e  d+ p
unrar x test.rar     #解压test.tar% _9 U4 n: C, C6 A" z
压缩率比较
& ]8 m% u) Q; S+ @/ ^8 m3 H7 N' Y  H
压缩率一般来说:6 \7 y) N- y- c# T% s7 W
tar.bz2>tar.gz>zip>tar
0 C3 K, `* p( _7 J) ?# R6 e压缩率越高,压缩以及解压的时间也就越长。. `$ h3 |: K1 L2 ]5 k# O
总结
9 e+ q" ~& g) |2 m: s
% ^; I9 T* p! h  ?; j对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。9 W; z% w& i$ ?( ~# }5 Y4 d3 f
有任何补充或建议,欢迎留言^_^。  g# r; A8 Q, Y

/ p0 m) w, C* z+ Y
  a6 Z6 V6 A' a4 h, X
9 S& {1 _+ I' f5 l! K1 s

/ h/ Y- G% m' U7 \

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-5 04:26 , Processed in 0.071107 second(s), 33 queries , Redis On.

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