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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

5 G% X2 F3 J' M, Y4 V* s+ i9 Z, z- V( k5 c) s) u

; U$ K# b  R0 \* h# b前言
4 }: Z* a% F/ w) E9 T, ?: O! T' ^- O2 E& K1 \( S
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
: ?( k1 u/ D! p- u" wtar9 T0 ^6 u3 H4 {: Z+ X& D
* N" w( N' }$ N; d6 [5 ?( E0 L. z
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。' X& |4 r$ J7 o
涉及参数说明:
* H- |6 w8 Q1 z2 G
-c 建立新的压缩文件+ [9 b) l- j1 |$ l4 V( M. q
-r 添加文件到已经压缩的文件
# @$ q% ?( c0 j0 z( ]; t( ?( p8 V-u 添加改变了和现有的文件到已经存在的压缩文件
6 ?- A- A8 |  w# i$ i-x 从压缩的文件中提取文件! i  G- O; ]" I2 d6 N
-t 显示压缩文件的内容
/ X5 I2 x' O% Z+ L' l: v0 l3 @* g3 f-z 支持gzip解压文件
  W; \. N( M) @" _2 k. a) f. q-j 支持bzip2解压文件' z/ w/ b! A1 Y3 R0 G* A
-v 显示操作过程- |* r; ~8 @- X- h9 Q
-k 保留源有文件不覆盖
4 N5 i5 a# C, G1 e- y9 q+ F$ @6 l-C 切换到指定目录
8 i% R5 c* y+ g" c. }-f 指定压缩文件( S6 L# P  @& b- {) O) e
, u- \/ ~( H4 j
--delete            删除包中文件% L9 m4 y, i" z& k4 F
--strip-components  去除目录
2 E/ C  i* v6 b0 J6 u--add-file          向包中添加文件) e: Q% R( `8 }3 @  T2 k
压缩
; x+ N( [/ B; g  V( q0 \
6 d$ Y# n$ }- ]7 Y8 |9 ^7 A归档tar包,不压缩
- r# h7 t4 e+ k1 H  g
8 U7 A" t+ f5 Ctar -cvf test.tar test1.log test2.log #归档多个文件
6 l! _9 }: M  ~tar -cvf test.tar test/*  #归档test目录下所有文件  F. K+ `  N4 A8 q$ J* }
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
  `& n3 a6 _1 y由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
* l: o6 w0 W1 S2 Z4 ~* N归档并压缩为tar.gz或tar.bz2
* N/ @) b/ g5 g4 f: B5 A9 ]8 G; |/ n8 S' u
这种方式打包对文件进行了压缩:
1 E' i, ?# n/ ltar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
& d" ?  O- o$ g; W4 h% Ttar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
) l1 {# e2 K9 m查看压缩包中的文件$ O2 X; ?& c# H7 W, A6 C( x

+ Z" H8 r' x5 O6 x如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:- p- R9 Y; g! E% m
tar -tvf test.tar #可查看test包中有哪些文件
4 M) I9 S8 X7 w  Y2 s/ q& q打包后删除源文件
  r" h0 V- X" k1 X& t/ A
" k0 D  A6 Y# w" c9 {有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:" }. @3 b! Q1 D
tar -zcvf test.tar.gz test.log --remove-files
' n: X$ v' W+ s0 S+ i' F. n) v打包除指定目录或文件以外的文件( q, }1 H& K( d: G' k  e; D, d

& q! x) e1 f* o+ ?1 O; E7 i4 t2 E对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
) @" {8 z& w8 T" L( U6 ?4 L5 Ztar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件+ y+ e" ~! E7 X% c. U- a3 L$ Y
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
; q( `- C( L- Y! F; o向压缩包中更新文件- n- b% [2 \) f9 ]) _$ a* l7 a6 S

4 `% V% y5 k& i- }/ r例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
; U; l5 ^4 I- [4 U9 Utar -tf test.tar --add-file=test #只针对tar包
8 Z' ]! G5 p* \# l6 R向tar包中增加文件# o+ [3 S5 x' G6 d* ~( {
  W2 o# z/ \, v% v, e
向tar包中增加文件可使用-r参数:0 E& k0 ?" r1 J& ]1 j: p* F; G! I
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
) Z/ p3 @9 ~7 G3 Q$ E6 z9 E删除压缩包中的文件
; |" O( o) Z& d3 N& N: _" p  L! o1 B4 J+ Y7 A! \  U
在不解压的情况下,可使用--delete选项删除包中的文件:2 _4 _+ D4 t& \: v4 {& x! ~' O
tar --delete -f test.tar  test1 #从test.tar中删除test1文件1 v% _: X2 ~0 Q# [. G" l, h$ G# q
解压
3 M$ ?0 `- I% _0 p: S7 L& a1 D$ q- ^4 k, D
解压tar.gz和tar包到当前目录* E' u8 v0 f. |8 z

; Q/ b$ j( V1 \8 P) ~0 w' \% z1 ntar -xvf test.tar.gz/ a& n6 r3 h3 `, S2 h
tar -xvf test.tar & f! y; ?3 Z$ s0 \2 P/ n
解压到指定目录% D* _; F& x$ N! b

. @5 e/ @- K7 |, Ztar -xvf test.tar.gz -C dir
. v  Z: m2 b2 q9 Q! d# Ftar -xvf test.tar -C dir4 h4 X+ u! T5 R* ]6 E2 K  ?2 a% y
解压包中指定的文件
( A( q* ]- P6 C  [) N  b) X2 M" R" L  n* @! S1 W. e. {' I
例如test.tar.gz包中文件情况如下:# g. J# i6 w+ j
1.txt
3 O2 |3 o! Q* e, D7 o2 o, Vlog/
$ ?+ ^/ ^% P/ v# g2 N6 Nlog/1.log" ?  G0 T6 D% p9 M$ D2 |! M
log/2.log
0 G. y# \9 ^7 U4 e7 Ulog/2.log5 @& B0 x+ p3 }
log/4.log
0 q* ]2 b. O; Q" [2 Llog/5.log
5 M) v( X1 ]3 o1 V如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:1 N: \+ J# }" n* |0 r' U5 t
tar -xvf test.tar.gz log/1.log( t' ]  g4 ~- d7 F, C) i1 ~' d  ?
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录$ b# G. f+ G$ |9 W1 r/ |
解压时去掉目录结构
6 o' Y2 S9 [' L. Z7 _
3 v8 [$ _) t5 y* a/ N/ v9 F压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
" {9 W) A! T( G4 D9 i3 \tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
2 a; W& W6 A% C  b  Z解压时不覆盖原文件
$ l7 K1 S# c& _+ l0 L' A7 Q
% Y6 Q" }4 C: d* ]/ V5 ~. y当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
" S" z/ [4 Z/ t8 O+ j4 a/ N* }tar -xvkf test.tar.gz
  R* E7 A( P) U) }2 E! b  }, C特别提醒# x0 E2 |: a/ W- n* B

/ y+ U; m, f9 G' U& Z! W/ t前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
+ E6 d7 N4 _1 o% Vzip/unzip; n" z5 V) Q! D5 }! R# Q: ^
7 I1 k' u3 K, m/ g& c; A0 k
zip和unzip命令主要用于处理zip包。
) \1 ]; m- s* _1 d- N% n" G压缩6 ^2 z: V; ?' h& C7 o$ I
* u' Z, o7 R& F* X# }
涉及参数说明:( U: J# `, n; F: q
-d 从压缩文件内删除指定的文件。
/ @% v4 |. Q5 g-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
  C& b: p% h( N. y: {, ~-j 只保存文件名称及其内容,而不存放任何目录名称。, l5 {: `% w; c/ |7 m
-r 递归处理,将指定目录下的所有文件和子目录一并处理。# j) R1 p/ l4 {# o
-u 更换较新的文件到压缩文件内。
1 s( B$ d9 p. m) }- K3 @-v 显示指令执行过程或显示版本信息。8 Y$ `" o2 E& n% H- i& g
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。6 a* N& t* s3 _1 r& b8 I4 Q
- <压缩效率> 压缩效率是一个介于1-9的数值。5 M  v7 U# s- r0 c
压缩文件
, U6 V) y6 ~- l$ v" _; _) s6 B8 U4 E' x* s- e4 x" Y
zip -r test.zip test/ #打包test目录下的文件
% j; q% y, S: c1 ^( Q/ Z: y) Nzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录" e. R  z8 x5 F
指定压缩率打包文件
" d" \7 }# n; Q. H
% O2 q( s' c1 {9 @  {# F) i+ @# Bzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长/ q& @0 [* Y( F% R  A& P
打包符号链接文件- M; j  o& F& ~, m

. s7 S; G1 E& \+ ~& e/ I/ f  G前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
6 f' }8 h4 @% F  T3 rzip  -ry test.zip test
9 H: h& t9 ^* ~% I4 d& H向压缩包中增加或更新文件4 }: y; J# e  x  B' c& @

, O( q  d2 I* V有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
, \3 R% ]& A0 l/ p+ C  Z1 B+ ?zip -u test.zip test2 #向test.zip 包中增加test2文件8 [+ H( F6 R* J% x
压缩时加密
; B$ Z: l3 b* p8 F
! }! I3 V3 s! [& O9 C压缩时如果需要对压缩包进行加密,可使用-P参数:
$ t6 b  A; m/ \+ fzip -r test.zip test1 test -P 66666 #使用密码66666加密% m2 \7 ~" a) o1 n5 I8 P
删除压缩包的特定文件
! b8 a4 G7 J( T# B: G, o+ Q) x
; Q! R$ P  B1 ?2 e$ A; ozip -d test.zip test  #删除test.zip包中的test文件  _( X/ d* [* A
解压
8 V& H. O0 W0 Z# e1 O& l7 U! y5 T) M. t( Z- B3 v0 u
涉及参数说明:; a) @+ V" i) ?
-l 显示压缩文件内所包含的文件3 @$ ^; A/ r: B! g& O% _
-j 只保存文件名称及其内容,而不存放任何目录名称。0 Q: t. b4 z& n" s
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
" _2 @: b2 G- V" H* ?0 ?; f4 m-v 显示指令执行过程或显示版本信息。
) {3 r2 J5 c% m) p9 K8 w# J-d 指定解压目录,目录不存在会创建
! R( p  ?% y2 Y" l! @查看压缩包中的文件信息6 s1 J# p" b, @5 q9 m" R
  _- F) w! G: u- h8 w, l7 V; t
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
  J8 o2 r$ T& ?/ iunzip -v test.zip #查看更多信息,例如crc校验信息等2 _( V% b# p& X& {6 }" E
解压压缩包
  J6 s8 U3 o) Y: E" z2 c5 k; Q5 f% ?# j" K" |' l
unzip -o test.zip -d dir #讲test.zip解压到dir目录
- L* J( e8 W2 X7 L9 i" }解压包中指定的文件
8 _. C+ U! n# b1 N) j' n, p: z
' y, i- o$ Y- Q如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:; A& b7 r8 K7 P0 i* C0 H
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
7 F6 a2 B. T7 U* M0 cunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件! f  E, E! q2 Z3 d" P
解压时去掉目录结构
6 l% J& r$ U8 E* M# }8 I# k; o. }
  }: G3 ^1 ^; f压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:/ e+ h: F/ x7 D3 Y; v7 q# q: P
zip -oj test.zip -d ./temp  # t( c- ]/ Z6 o" t, F
解压jar包) c% V! {% F! P

: L1 k/ _# a! D, B+ o- H" Ijar包是java归档包,但同样可用unzip解压查看里面的文件:( F0 B/ T4 I) R  }8 F; |
unzip -o java.jar -d dir
, P2 z$ b; R3 I9 R9 o" }gzip) l9 \+ f8 W$ J% f+ r5 q

* H6 ?, D# _9 P. i7 S* a涉及参数说明:
. s5 h: u  q' J) k! D; y5 }-k 保留源文件
: p( H& {% W& Q: R2 H& Z# d-d 解开压缩文件
5 T9 _& p/ a" d. h7 {+ s$ Q-r 递归处理,将指定目录下的所有文件及子目录一并处理
. X3 A! |4 W- ]6 B  t2 P; x( R1 y-v 显示指令执行过程# Y; n% `" _/ z4 R5 r- ?; f
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
: @( ^! k# E! ]8 h' W6 Tgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
7 C, y# q: n- n6 f: @# |( \8 x1 Hgzip -rkv ./* 递归压缩
) P% I$ E" I5 d解压也很简单:' u, P- b2 F6 Q
gzip -dv test.gz / f7 z  ?" |# Z5 ?/ r( D/ f& Y7 M
bzip2$ Z! O' R1 ]% {( G1 h
( u0 X9 K; O1 x# c
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:8 W9 P, e( b- m# T3 H) G4 {1 h
bzip2 -zk test  #压缩test文件. w* A" C: T% V' |2 _" p
bzip2 -dk test.bz2  #解压1 M- u; U5 [7 b
rar/unrar. T" Z( F+ t) U' L) T

+ @. z3 j* A  J1 D# Y0 Rrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:) C5 R5 |0 H& D3 }
rar a test.tar test  #将test文件压缩为test.tar. R" m" D( T1 r, U, c- r% G; {
rar e test.rar       #解压test.tar
$ e, _) q2 G% ^$ Yunrar x test.rar     #解压test.tar
. ~, J% y7 ^! ~5 ?+ [, t压缩率比较
: `$ M5 L  D1 @  e5 G) j( w: q9 ]2 W2 e  a" w3 `4 R# j
压缩率一般来说:
9 |# @* F( |0 M: H5 ftar.bz2>tar.gz>zip>tar
3 R, {; s* A+ p" O3 a/ U压缩率越高,压缩以及解压的时间也就越长。
4 V2 T2 S) C1 w, Y1 Q1 `总结
+ a9 P( @4 N, C! J2 z! n' Q2 ^
6 l5 C7 ?8 a) j3 v" Y( n1 l9 A对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。- p) K# E) D" |6 }( L: t! {8 {
有任何补充或建议,欢迎留言^_^。
2 s4 P" X) R1 R* U0 `
8 u; W" M* i8 M7 B  g- Y- n; Y* ?2 ^8 Z- v
  Z/ X8 e; Y5 S, p  R

0 |" K% q( o' r8 N0 l

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 08:37 , Processed in 0.061453 second(s), 43 queries , Redis On.

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