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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

1 H* q( [0 p9 ?5 {
8 n5 a5 {+ e* ?) _. N: y3 v

2 T+ ^6 e9 t; k# }# X7 T2 W前言. n! Z9 x$ h9 e  D

) l# D: I2 Y7 M& I! iLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
7 _8 t3 u  I: j( b/ Btar( C" {6 ]  `8 z9 ^
0 a8 f: O! C/ F2 [0 R/ ~  M
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
- u! O: t* |0 e  R! u2 E涉及参数说明:

5 e3 ~, D3 b4 Z6 |-c 建立新的压缩文件( `/ h  j# A5 G/ L$ [2 ~
-r 添加文件到已经压缩的文件* V3 D) R2 r5 ]# s' V
-u 添加改变了和现有的文件到已经存在的压缩文件
! g* _1 c8 F, X! k$ s-x 从压缩的文件中提取文件* {# ?: y- x' L
-t 显示压缩文件的内容) M! T" w. m& c! Y* `* N- }8 R
-z 支持gzip解压文件  L& C4 }7 P0 |( F# ^, E$ o
-j 支持bzip2解压文件
* j9 n2 Y9 u8 t, A$ [-v 显示操作过程
$ @. Y9 G7 g/ D! _6 i6 _/ F-k 保留源有文件不覆盖% I  r4 ]4 Z8 B3 W, w8 k( c
-C 切换到指定目录; E& B+ a6 i. F1 _! s
-f 指定压缩文件/ Q" v/ U2 T$ @" u* @9 @

: v, \5 \4 b$ u7 \' a! E--delete            删除包中文件
! v  p! a5 j. u  i- k6 B--strip-components  去除目录( W6 u, G2 N& @6 J+ A  g
--add-file          向包中添加文件3 j0 o, a8 k1 t& E% ^6 t
压缩+ s. Y% l3 W7 k. y' c0 g: Q+ m! q
# q( C8 R9 p: A5 }4 {* m+ S  z
归档tar包,不压缩. r% X5 S1 ~& L# r
* F* P' t0 b( A: j
tar -cvf test.tar test1.log test2.log #归档多个文件
, D: B! J" b" }* t- T' j  g0 e$ gtar -cvf test.tar test/*  #归档test目录下所有文件
$ ?' V+ H! n3 f2 [tar -cvf test.tar *.log  #归档所有以.log结尾的文件 ' t2 y5 I4 A. g9 k
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
$ A. f) N6 h& v. a  L3 k归档并压缩为tar.gz或tar.bz2
9 T9 j5 o6 d' V( R6 m: T3 B1 L( Q7 h6 q, z
这种方式打包对文件进行了压缩:
$ f7 g+ S2 M! \' H4 q# ~2 Star -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩2 v+ j* s. S: c6 G
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
3 u; ?+ J2 F: b' b9 `% h查看压缩包中的文件* W1 V- W$ I2 `1 f

7 d+ C  _- R- W& v0 C如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
0 Q$ x6 y+ s/ [tar -tvf test.tar #可查看test包中有哪些文件
8 e: R4 B- Y+ `4 |打包后删除源文件9 V4 l- c6 B$ {: n. f5 m
3 {( I3 x4 O0 q9 Y: X
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
, T8 F* P( r6 M: V& s2 M) Q  Ztar -zcvf test.tar.gz test.log --remove-files
5 ?1 `4 e9 E3 ^打包除指定目录或文件以外的文件  R/ a; @0 m7 e' v
7 g0 X% s6 X, I# w% ^6 H+ S
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:7 }' Z4 o4 v, b
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件( `" z7 |6 I- f  N
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。; |5 E9 @' r8 |8 ]
向压缩包中更新文件  c) S9 s8 |' P. W

! {: r- M* P0 z) ]( d例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
, c! C* B. m  Etar -tf test.tar --add-file=test #只针对tar包- c' n. W$ _- z  q' X9 }
向tar包中增加文件9 [0 r& }: d& n8 r

* |  K' m, N3 S; ~7 E! [向tar包中增加文件可使用-r参数:
( R3 z3 @: @: c. B& ]0 x3 u* wtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
% d: I9 |4 v" F4 }8 M$ z7 }删除压缩包中的文件, o; \) L& l' s( l% Y
4 z1 c) h* y# [$ Q5 A! x8 [  b' e
在不解压的情况下,可使用--delete选项删除包中的文件:: I# {5 q, P( ?2 H3 f0 P3 Q4 I% o
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
; _' r' K; K& U5 X6 [1 y, E" G解压( l9 }1 H- `/ e6 X
! [" g' A& y( B( M. s
解压tar.gz和tar包到当前目录
  f# g6 X: K- d2 W% E& o2 J& y/ Y3 b3 j* j' c
tar -xvf test.tar.gz
; v# y+ \( s2 C- {6 Gtar -xvf test.tar , d# b5 X# U  L; C# [. M4 S
解压到指定目录
) ~; d% k2 Y2 g- G; r/ F3 a3 z# Z; Y6 m& P: c, Y
tar -xvf test.tar.gz -C dir
# }4 l9 S9 d3 y: Q! @( _! ktar -xvf test.tar -C dir
: L& _$ @( w6 x/ `解压包中指定的文件8 _3 K' @0 N/ ]/ s( n  h1 P
6 {; O+ S+ e! p) A5 H1 |& {. H' M
例如test.tar.gz包中文件情况如下:
- y0 H& T4 f% k1.txt* U  B3 T: X7 ^8 Y
log/
! d( e$ g- ~  T/ i: o- vlog/1.log% H8 h) m0 T" c# |- `  G  }- x4 O
log/2.log
* [6 W5 W5 j( r' f/ f) V; Tlog/2.log
- M0 F" |0 A8 z# r+ h. j: q0 R9 v# Plog/4.log
8 g4 ?7 j- O) O( O4 l$ k1 vlog/5.log4 O5 {1 h" a+ ]- i* W9 Q
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:' ~1 M, ?) T6 f2 W! _  g" _! z
tar -xvf test.tar.gz log/1.log
5 T; o9 K( Z8 h# Mtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录2 U7 s% j  Z6 L2 y9 F
解压时去掉目录结构, ^* V( @. {" n$ J4 x
$ }% d- z# f8 ~
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
$ ]) S, g3 i3 y% b; P: utar -xvf test.tar.gz --strip-components=1 #去掉一层目录5 {; x3 X: i) O, O; P0 \" K. `
解压时不覆盖原文件; b3 m: S+ a* n- @" T. g2 W

( E8 p, A" U% P0 q( t2 [' u当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):0 v1 P# B9 P; v: k& q5 v, ?
tar -xvkf test.tar.gz4 V- i" X" l" s
特别提醒* j1 c2 T1 e2 ~, c3 ?* V
( U0 l9 p. d! N( H7 I- i
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
  Y/ ?) _! S1 y, }9 M, K2 mzip/unzip0 J9 P" F( z- I+ a. O- g$ w, z
' P  P1 [3 s$ E
zip和unzip命令主要用于处理zip包。( H& v" {3 B4 D3 X, J& S
压缩
' ?4 s( Y3 C) a# z4 b8 T9 X$ R
2 B) w. [7 _) I" q7 c' O8 c% f涉及参数说明:
) @4 q+ [* l1 N$ @7 w& K9 v$ e-d 从压缩文件内删除指定的文件。
3 L. h" L7 }" ~/ i1 B-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。( G; S& H, h) b4 }  m
-j 只保存文件名称及其内容,而不存放任何目录名称。2 B2 z+ H0 a6 @- a5 Z+ |1 h7 O
-r 递归处理,将指定目录下的所有文件和子目录一并处理。3 t6 q! l5 c( ^
-u 更换较新的文件到压缩文件内。
6 h9 K5 c8 u; r, m, F-v 显示指令执行过程或显示版本信息。
4 w  X0 N, U5 b8 E9 X/ @! h-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。  d" [8 E- Z+ E: T" T8 D$ F' ]  E+ w
- <压缩效率> 压缩效率是一个介于1-9的数值。
& G# J' @9 d7 S: E0 p0 a; L压缩文件
) j# \1 O5 V) }3 q0 Y9 y8 n: h& L  W& R2 q1 a! Y; U. {) Q- d5 B1 x3 F
zip -r test.zip test/ #打包test目录下的文件
; b6 M1 O0 I1 _$ V( e6 czip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录8 A/ |$ U3 r- E5 e  [9 a
指定压缩率打包文件" D" U" M% I2 k$ U
' u& ]4 V, |' [8 S" m
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
8 T# u! A4 o. i* k# b$ M( o打包符号链接文件
% k0 H4 P/ l& {: o9 G; Q$ d$ @+ p; q9 L( b) [) e0 x4 i. Z) n$ e; J4 e
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:% u9 Z9 |; j' l# h/ j7 H0 I) F6 x
zip  -ry test.zip test% l3 _- d6 L: {% }. A' P
向压缩包中增加或更新文件
. O8 K9 D; o4 K8 \, {, i  B) C+ e% U8 Z3 L  n# C
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:/ k% e" l! k  O; t! a
zip -u test.zip test2 #向test.zip 包中增加test2文件
* Z7 k* J8 C3 Q- t! o压缩时加密0 o# B; N8 |5 s
3 n+ u/ s/ N5 R$ l" O. L
压缩时如果需要对压缩包进行加密,可使用-P参数:
1 Z( ]% M( f% a% zzip -r test.zip test1 test -P 66666 #使用密码66666加密
! \6 |: o( \2 _5 ~8 N7 t7 S删除压缩包的特定文件3 I7 v: z% l* P, u8 o5 K- R2 L

6 D  J2 H" U/ X+ [zip -d test.zip test  #删除test.zip包中的test文件
/ \8 N* Q; d7 Y7 E' H解压8 m! G5 \& j5 A  N" z/ O# Y  z
/ r+ [. v' E. D5 J* T6 E/ V/ l
涉及参数说明:& O! ~3 [, |; T8 F# u$ b$ I
-l 显示压缩文件内所包含的文件
8 |% n" F6 {1 }/ Q+ K: E9 B2 K$ v-j 只保存文件名称及其内容,而不存放任何目录名称。
2 u3 D1 E' ]! {4 n4 r; @0 m-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该! Q, t; b3 a0 {& u- b
-v 显示指令执行过程或显示版本信息。
! Z" L. _; l2 p0 n/ r; k-d 指定解压目录,目录不存在会创建; V# R4 N7 [- I1 }3 G  w; d7 q
查看压缩包中的文件信息
3 D7 E' [; q, R8 {) {2 \. c  P9 g3 Q8 |: U$ ^" m0 V! t8 ^: B! a2 i
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
+ l8 P4 J0 [& b+ Z6 bunzip -v test.zip #查看更多信息,例如crc校验信息等
8 P4 w, p- @; [3 T/ W/ a- R8 c解压压缩包7 g. n4 Z' D/ ~& W: d7 T, |

; n) |* s( o/ X1 I7 a  ^unzip -o test.zip -d dir #讲test.zip解压到dir目录
, b4 u# [- o3 x3 Q$ w2 Y解压包中指定的文件
' ]# z8 w3 e3 ]- t2 ~4 w+ g; h
6 @9 \! {4 u7 S; j) B, z如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
. a: p: ?) ^1 d1 N2 eunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
# ?$ R- L! j6 x9 nunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
1 }7 Z( ?( V. B7 R解压时去掉目录结构( R: B; _/ X% K1 ~5 q
6 e9 H2 \8 P/ h5 t/ }" c7 X3 B
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:6 R7 O, E$ X8 ], q9 [
zip -oj test.zip -d ./temp  
6 d  s4 A# B- G( K4 \" G4 H解压jar包
( v& p6 P, \' R$ A. F8 R2 ?2 {# f7 d' J& R; T3 N" l
jar包是java归档包,但同样可用unzip解压查看里面的文件:
+ p; j! H$ k3 X& `% ounzip -o java.jar -d dir, @$ }1 w+ |* g" J) N
gzip2 S/ T3 }4 V) n( t

1 s* L" _& a1 L+ i: ?涉及参数说明:
; e. k) Z6 C- R/ W: u1 X( V-k 保留源文件
  {' K, X6 f! n4 n-d 解开压缩文件
4 V( r: `4 F: H" G. {-r 递归处理,将指定目录下的所有文件及子目录一并处理- D( w+ p$ P* N( H& W5 Z) Z; @
-v 显示指令执行过程
5 a% n( g# Z4 m2 U) u6 H4 T( f, p! Gtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
# Z+ y3 H: |) K/ m+ v( v$ }gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
* p" V( W. T/ ~9 u& e4 e0 M- qgzip -rkv ./* 递归压缩! ]) @5 ]3 c+ B# Q, i
解压也很简单:
) k4 t$ q+ G: hgzip -dv test.gz " [' G: O$ d: F
bzip2
* u$ a! z/ ^, M3 F+ w2 @7 V0 d- [3 ?# M0 i7 t2 _
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:4 A8 }% o0 w3 B% c1 B  f' Q
bzip2 -zk test  #压缩test文件
: g) [6 o/ H' t- p9 s2 a2 Pbzip2 -dk test.bz2  #解压* j; M/ `+ @4 M' J8 p9 T4 |
rar/unrar
6 ^6 z8 z! |  [3 m% i0 F4 v7 w2 O- ?" k( W& e1 T, T( [1 |$ O  I% P7 j
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:9 s8 a' J8 c0 |' R. u$ c3 k
rar a test.tar test  #将test文件压缩为test.tar
, ?% Q6 A: o  }- m1 o& ~1 U0 zrar e test.rar       #解压test.tar
% |& g& _/ ]3 i& }( munrar x test.rar     #解压test.tar7 l: A8 L, U5 E5 E: m2 {1 _% y$ s
压缩率比较
# \) R  @0 @6 m3 H
4 d) M1 v& V4 P6 _3 @  ^# T压缩率一般来说:
" F4 _3 }& C+ ~; x; ^tar.bz2>tar.gz>zip>tar7 P+ {+ w. A  v2 ?- V  O6 V
压缩率越高,压缩以及解压的时间也就越长。( S! f; J) _, @, R& Z% q6 K1 Z
总结
3 I2 a. C3 G1 P8 ~' z$ S
/ R: P) L, Z" v2 c, Q: F  W( Y, |对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
/ O7 K0 L, k! x* [: |# \3 x6 y, r$ W有任何补充或建议,欢迎留言^_^。3 [$ ^, f( w4 s( ]' M

! P; |" k3 `5 a) k0 ^: J7 [1 P
% u, ^2 {. O) E9 c
: W4 @% ]; W4 M" L2 {9 \
9 y# ?, k* n0 k* x( U8 x+ F0 @( ~- Q

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-23 06:38 , Processed in 0.068777 second(s), 33 queries , Redis On.

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