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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

, t9 t# K) {# e9 X+ }
, M) ~6 F7 C* G& u+ s
/ r& m: M, g! B' ~4 d. v. h1 ]
前言
8 A# L! U+ I2 D1 l; M( Q! I# d* x2 B, Z9 [3 \
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。& B5 V* G! A3 b! Z$ Q+ a
tar$ D! n* V% x/ J; l: z% ]

$ i% u3 x; `$ K) wtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
" e9 l  d! {3 N/ x6 N涉及参数说明:

* I7 D- M2 N! Y-c 建立新的压缩文件+ G. G' X- k& X
-r 添加文件到已经压缩的文件! g+ X% H+ Z0 p' J. ~$ E9 O% \
-u 添加改变了和现有的文件到已经存在的压缩文件
  ?/ X' o3 O; h+ @9 |; s8 b! r-x 从压缩的文件中提取文件  s; }* h8 s/ E+ `" Q  ]9 H$ J: m
-t 显示压缩文件的内容
+ a3 A0 k0 p7 ^/ _; }, \. a-z 支持gzip解压文件
. j) K' x( i6 o. g/ I% l, H9 \-j 支持bzip2解压文件
3 Z) j5 i$ W6 |5 [2 }0 G1 D-v 显示操作过程# ]. E* z" w+ K' k# U0 h% ]" \
-k 保留源有文件不覆盖2 n; x8 b  T& B3 s7 z/ R" ~+ w
-C 切换到指定目录
9 X4 @2 s' b$ ?- C4 ~-f 指定压缩文件: t7 ~4 e, g+ y" X. N7 k; S
4 f' T& R! O6 q( h: k: L
--delete            删除包中文件
6 q( w' [3 n5 S8 ~$ s) }( z( a! Y--strip-components  去除目录
1 Y6 d2 x1 |5 X/ A+ H0 }--add-file          向包中添加文件
+ H' I% k* @. T压缩
' I" R% {& ^: V& v
1 @2 k! h; p- D# V5 E  l" g+ P8 w  K归档tar包,不压缩2 C% f5 s2 U# E

9 t) Q) E; y% ]/ Z, vtar -cvf test.tar test1.log test2.log #归档多个文件. @3 E' T* R" U4 I, J( v; M
tar -cvf test.tar test/*  #归档test目录下所有文件/ K% v4 Q9 S9 @
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 5 n2 R  Y* k- D7 t- q
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
1 l2 F1 A' V' J归档并压缩为tar.gz或tar.bz2
0 V- T1 E: S/ Q/ z. G) V0 e5 Z# h- l$ R! `' q1 i
这种方式打包对文件进行了压缩:
7 }$ |1 Q* [; ]& q  D/ G: K/ @9 ktar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
2 b/ S# S" o2 @tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
* k$ P! W: Q- O: d9 A7 y( `- K6 t" s  ^查看压缩包中的文件+ H3 s# E( l$ u' G2 a! b) ?

. b, o% A2 B) w. t% @9 b% P( Y+ K如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:2 d5 ^7 V* P% p# g
tar -tvf test.tar #可查看test包中有哪些文件
! B& \! E3 s% w打包后删除源文件% q9 ^# Q* B( e) q

" Z& Q2 d% t6 M有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
( Z2 f3 [; _7 ~, p% M. p8 }tar -zcvf test.tar.gz test.log --remove-files . `& |/ c% c: ]9 m* J8 n
打包除指定目录或文件以外的文件
+ {# q9 @3 V* `' W
3 [9 \7 X- o9 a1 K: ^% s对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
7 Y: b1 {6 Z9 ?; d. W( w7 Ptar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件* N# Y4 ]. W7 e# G4 J
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
9 v5 a  G/ E9 B4 Y6 Z* h( B1 z向压缩包中更新文件
% C" V+ O! g7 Y3 X6 o/ N3 Y5 c
! |1 E: F; q0 J: E+ K/ z例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
( Q1 i5 T9 I3 W; z2 ?. x: h- Otar -tf test.tar --add-file=test #只针对tar包
' ]3 _. s. E, M0 E. N) J, m向tar包中增加文件
$ i& C/ w9 e7 X# \0 {4 a" e! H) m
向tar包中增加文件可使用-r参数:
3 k9 X3 q4 a8 ]5 j1 star -rf test.tar testfile #在test.tar包中增加文件,只针对tar2 B. R& x. K& j$ a1 A* W. B% _( b
删除压缩包中的文件3 \$ p: P$ h2 P  C; J3 }/ Q

6 T* V9 w' A; |0 Y7 R( ?& q在不解压的情况下,可使用--delete选项删除包中的文件:
5 k7 @  V2 A  Ftar --delete -f test.tar  test1 #从test.tar中删除test1文件* _: T& ]& |! z/ V
解压! Q0 Z( Z8 H( j) U, K+ T, X
$ v% k% L# J7 {0 R
解压tar.gz和tar包到当前目录4 L& V5 r- R  V$ s

. u) m1 s! N8 O/ ]3 b( p6 R+ w& Utar -xvf test.tar.gz
2 i$ q+ {( d* etar -xvf test.tar # @- H, n+ f/ A6 T3 T- d  V$ k
解压到指定目录0 C0 o8 M/ S0 y4 @

0 u$ \, c  N: I7 c2 Atar -xvf test.tar.gz -C dir
8 f$ r# K: T( \/ l  Utar -xvf test.tar -C dir
. U4 |  d2 F2 m  X% o4 E$ ~解压包中指定的文件
! q' N( P  \4 V; V3 g4 ]# A8 H. s" Z, j7 O. Q
例如test.tar.gz包中文件情况如下:
( S8 w* z+ k( l2 }; K$ L1.txt% }7 r  U  ]% O' i
log/2 _2 ?( j" o4 n! y8 x% h4 a( N7 j
log/1.log! R" P0 z1 w6 [) C+ v+ J* c
log/2.log! y) a% p+ Y6 w) R/ z7 y
log/2.log- k/ f& @! n) C& s6 ]2 P
log/4.log
* i, N) S' n; [) q2 ?& _log/5.log' u; A6 g/ Y) T2 N0 x! W* K- S
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
$ f9 ~5 l; G0 Gtar -xvf test.tar.gz log/1.log
7 H. n3 I6 Y% }( j3 etar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
# Y6 T( ?+ A" _; v解压时去掉目录结构* r  p3 G& n0 V/ [; j
: T6 |6 r' w) z, Y7 P9 A
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):2 i+ n9 @. X# ~/ t
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录% N& [! c' q( [4 R& G
解压时不覆盖原文件# ~0 B# f  r6 I. u5 u
) b$ C; f& v. `
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):3 p: o/ L, q7 l, a# C& g
tar -xvkf test.tar.gz7 E7 U9 o5 F& z: ~: F$ l
特别提醒
. b% Z5 ~' g/ n& E3 x2 N/ E% K1 O# s' L3 `3 h& s
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。: I$ l9 I! O  F" r" ~. P
zip/unzip
% P6 ?' s8 N' w) q& @6 [8 _5 r" ]. Q% Y" w
zip和unzip命令主要用于处理zip包。
7 a& O5 S) W& {4 s; h6 x% R. B* ^压缩
, Q% W+ b, k$ i9 Z/ k( \1 y: p' h- b4 h
涉及参数说明:' P6 `5 Y: W9 R/ Y4 o
-d 从压缩文件内删除指定的文件。
  L1 E9 }* B; b+ n% u/ R7 X-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。% `. e! j+ K/ b' ^+ B
-j 只保存文件名称及其内容,而不存放任何目录名称。+ i% e; L% W* s0 J0 ^+ }4 |
-r 递归处理,将指定目录下的所有文件和子目录一并处理。/ R, \% V. \7 \4 h* t3 e
-u 更换较新的文件到压缩文件内。6 b0 b1 @( P- a; O; F
-v 显示指令执行过程或显示版本信息。- i( Z2 _+ C  a+ ~
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
. Z  ~3 ]# s' M% W+ i: s/ b0 j- <压缩效率> 压缩效率是一个介于1-9的数值。
5 \& R9 z; _& P) a压缩文件
- L! B; Y$ M/ q! h/ \9 o- i) h; X1 ^. _& O
zip -r test.zip test/ #打包test目录下的文件
: ^' D; G7 ?" N% a; R3 ^& ozip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录' Y; k( S2 ]( M5 i# i
指定压缩率打包文件% A* A* j8 G* M5 Z
" r; `4 j6 K0 n% A& E: ^; o
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长( l" X' A0 V  L1 ], U& h' f8 s# B
打包符号链接文件9 M8 y6 k3 t! G
! _5 h1 X" O' c. ^2 k; P1 v
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:5 N/ D8 S+ ?7 V
zip  -ry test.zip test6 @7 Q3 ?3 w$ }* k0 a' u& F
向压缩包中增加或更新文件
, {/ s0 v; |1 @1 G. z7 }$ h4 M- X  W
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:7 p9 p) w; X1 |! e8 ]4 p
zip -u test.zip test2 #向test.zip 包中增加test2文件, M1 u4 {8 d$ o% }4 N
压缩时加密
& n  F4 ]6 B  d! ]1 ]( [5 Y( [7 z' ]4 S4 P
压缩时如果需要对压缩包进行加密,可使用-P参数:
4 y5 u, G1 A2 a# Mzip -r test.zip test1 test -P 66666 #使用密码66666加密- T  J/ c& A6 `  [" G1 f8 k# x1 B. w
删除压缩包的特定文件
: g6 E" ^7 U: U% F. [0 D$ Q. A
# f$ }! P' Y* l9 v7 n1 @; ^, Bzip -d test.zip test  #删除test.zip包中的test文件% W" v. r  ?2 v  _% K& B
解压3 h$ M: O; }7 m0 I5 N, Q' b
+ m2 X) e$ Y  d
涉及参数说明:
$ f" Q; @. F5 ~+ T* i- U9 Z- e( t/ N1 Q8 H-l 显示压缩文件内所包含的文件8 s3 V. J! k7 J9 K/ D
-j 只保存文件名称及其内容,而不存放任何目录名称。3 R. Y$ q2 M6 ]' N7 u$ d
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
: w6 b1 b# b& w% F# \-v 显示指令执行过程或显示版本信息。
! w* V0 R: U# f8 N6 J8 f-d 指定解压目录,目录不存在会创建/ I8 r9 }# A* L4 S4 T
查看压缩包中的文件信息& y" |1 p( m% P% A

  Q1 `# a1 b, y4 J8 y! Q# cunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
! M  B- Q+ q1 K$ a, X7 }unzip -v test.zip #查看更多信息,例如crc校验信息等5 T& o7 {) i0 P% X2 q
解压压缩包- P) E  E, p% Y, ^! V( F* A1 F

$ O4 E' ?: A  K8 {. |) Dunzip -o test.zip -d dir #讲test.zip解压到dir目录
& X3 M* X9 @8 k5 j0 J解压包中指定的文件
! z$ {  ]' S' v* `/ ^% U8 z7 O  C; q) N5 v: T* ~$ F* m3 }; b
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
! h0 U# N3 p" p! Z/ hunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
% c$ M. j0 `) p7 `unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
3 `/ [+ ^" m1 z  h% B解压时去掉目录结构* k( x% G) M+ b5 j

0 C3 U" o- E8 N8 Z' K5 m* `8 l压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
* A$ P7 v  m& G* N3 \zip -oj test.zip -d ./temp  5 b' E$ n2 E* Y
解压jar包! C; u$ G/ P: I9 h8 e6 [. }! e! N
! N  e& {/ T- I  u" Y
jar包是java归档包,但同样可用unzip解压查看里面的文件:) F$ T, x% r2 o: f" E
unzip -o java.jar -d dir
- A* [, o1 ^7 N1 c" E2 ^. G- E/ Hgzip( O2 j: v1 {0 ]8 G+ s

- e1 t$ a+ u0 K8 z涉及参数说明:
3 z. G+ X& L, g: W) _2 F-k 保留源文件1 _. M& @4 M# ]* _. O
-d 解开压缩文件) `, Z$ [* _, j6 e3 S3 }5 j* T
-r 递归处理,将指定目录下的所有文件及子目录一并处理
# @( X" a, z2 {2 s7 ^- U  ?, s. e& b-v 显示指令执行过程4 [/ f) [( M8 v, S- W- |& r/ E
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:! d$ I0 c, `% P" L
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
7 Z2 O/ Q2 J, T( {# Kgzip -rkv ./* 递归压缩2 p8 ]* q" s$ D
解压也很简单:9 m1 ^8 Y% R# _& d! z% ~# G
gzip -dv test.gz
0 z( i% J: Y% g6 r: R" X0 q4 ybzip2& ^7 o! r4 L5 m# J  C0 ]  x5 g
8 I+ k) i% Q; ?2 E8 D9 k  b& Y- Q% [
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:: z* y, c% ~/ L8 |' l+ L
bzip2 -zk test  #压缩test文件
4 w- q5 {, c) B) y+ L$ [1 Lbzip2 -dk test.bz2  #解压& I$ d: w4 k6 n3 I4 o' i0 f  s8 i
rar/unrar; G: G. I' w% ?) G: w# _; n2 R2 f) M
# X# V  f8 _) Y  Y" d+ y
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:- \1 k- @, R! i: z4 o  ^) ]+ Q
rar a test.tar test  #将test文件压缩为test.tar, P1 m, w/ n/ T( W
rar e test.rar       #解压test.tar
% C. v1 C$ i- P' S! S$ v" J9 n# j% Eunrar x test.rar     #解压test.tar9 r: q6 z  x& Z
压缩率比较3 U! [! q% ], c( t# _7 ~
0 q$ k3 ~; ?" D1 v2 [; l
压缩率一般来说:
: T3 {! f# y0 ^) @tar.bz2>tar.gz>zip>tar" @: x1 f: O, J) H% Q* G
压缩率越高,压缩以及解压的时间也就越长。9 x! o/ }- e% k1 C/ Q
总结
2 t! q( ]- t; f& b
) j0 b: \8 ^+ r" K' k对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。5 N/ e" H/ o  K
有任何补充或建议,欢迎留言^_^。5 u5 S. W/ e6 x0 U# {( h3 m6 w. E
# V" o* F0 v" G% U" ~$ P. x

' {$ Y  Y  t7 Q3 ~, G5 ]7 ]
5 L! @3 e/ o% t8 [! ^$ D8 {
& }5 n+ S$ V- G3 R1 S9 `$ J

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-5 00:48 , Processed in 0.065590 second(s), 33 queries , Redis On.

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