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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

+ x# `4 @; T- w( _- Y/ s$ X7 c2 h6 {+ r

  {3 N/ M* \" R) d前言
$ Y" f% }. x5 V- E
' A( D+ J( \" tLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。+ C' _$ _+ y2 t
tar
( o  Q# F# d, h
9 n% T7 m7 ?$ Q  dtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
# V5 e$ Q0 p$ Y涉及参数说明:

4 J% p2 z7 t2 @+ E* H: {- I-c 建立新的压缩文件
# o" Y+ e5 W. i( e9 _0 `8 m-r 添加文件到已经压缩的文件
1 j1 W0 C( h8 O0 p-u 添加改变了和现有的文件到已经存在的压缩文件, V" z% `% E6 x, a4 q+ P
-x 从压缩的文件中提取文件# b5 u5 J7 }! T* r1 R" k: e
-t 显示压缩文件的内容
3 i1 I8 L$ {( Y; @1 o$ K-z 支持gzip解压文件% O- J  \7 F/ K9 y. L; f$ \
-j 支持bzip2解压文件
5 k( V- h& O! j5 K- h2 i-v 显示操作过程% U& v9 n" [5 ]
-k 保留源有文件不覆盖
$ U" j7 B- e2 H( }3 w0 B( s7 Z-C 切换到指定目录! O4 s& h4 R& c) D  x; T- I0 d
-f 指定压缩文件8 y. r% N! s; u' ^# Q$ l7 P
8 B6 q! p; A. _% B0 r
--delete            删除包中文件& q+ O* C# V( t# ~! y& H# n5 n
--strip-components  去除目录
& _: ]1 l- m8 _0 d* O- W--add-file          向包中添加文件
' i3 m3 d3 _% Q5 R# A/ G压缩
9 y# x  r, S3 @! K3 A. E$ v
7 v# {+ f: a, d8 R# A' f/ [4 m归档tar包,不压缩
$ W/ o$ W8 G1 T8 o! O
& ]7 l) z( F" q4 G/ i9 Wtar -cvf test.tar test1.log test2.log #归档多个文件
0 H) A3 _% I0 i2 f6 b9 d) J# `1 ltar -cvf test.tar test/*  #归档test目录下所有文件
2 t( [0 L) w' r8 l4 P% ]% |  W5 H5 E' \tar -cvf test.tar *.log  #归档所有以.log结尾的文件
2 d6 Z5 I$ B* W( K/ X# z3 b; l% `由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
6 V* q1 A% `# U3 @- ~0 o0 p& F$ ~' f归档并压缩为tar.gz或tar.bz2: M) ?; @8 G( m
& O! n4 D$ B; R
这种方式打包对文件进行了压缩:
1 V& [6 n( n3 v8 Y* ^, ptar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
- x3 b; Q4 L: [- u/ Ctar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩1 l/ N% c$ A- A. x% J$ C9 S
查看压缩包中的文件
5 \! {+ p" l7 P! B7 N
+ S. @% h* w5 G5 @* Z8 _) Z: A如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
/ K6 N% K2 E/ U% ~tar -tvf test.tar #可查看test包中有哪些文件
& _3 E% R4 L- d! |' ~+ s: c打包后删除源文件
# B! d  ~* `. O; |, \. W" M( d: {4 T; v6 o6 J) V0 ~8 j- C
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:3 @, c; A: D7 m! i) c' d
tar -zcvf test.tar.gz test.log --remove-files 3 B+ `& }  P5 f' ]
打包除指定目录或文件以外的文件
2 c6 n% l" @" z$ q2 B8 O0 T* t9 ~1 f
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:. l9 _9 k0 w9 ]% [
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
1 l* s' ]) L& Q1 R这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
' F! `# B( g: ]& V向压缩包中更新文件1 a7 n! w2 h- P; D
6 W8 h. j. g" q' X( V4 [* v( m
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
3 g, u: o. |& k9 j0 Atar -tf test.tar --add-file=test #只针对tar包9 i4 e/ {! g5 a2 t; d5 }+ z+ y' {
向tar包中增加文件' q  P  B7 l8 A/ |# T% F* N, t

! B2 v& ]/ S, l* L% F向tar包中增加文件可使用-r参数:
: S7 _) V% j8 U3 Rtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar0 U4 G/ ^7 w. r! G  d' o1 f
删除压缩包中的文件- {6 F. ]$ F/ q& W5 ~9 u- V2 z; Q
. |! D  E4 P) Q( G# f$ G5 ^
在不解压的情况下,可使用--delete选项删除包中的文件:! M- ~  e& [7 n7 _
tar --delete -f test.tar  test1 #从test.tar中删除test1文件: v) v$ o* r- R  i2 Y7 |3 F
解压" b$ t3 g1 J* d& r- K) S: B& I
3 q! Q/ j8 v7 {& |, w1 X1 C
解压tar.gz和tar包到当前目录
: _( T5 v5 P8 n, w7 Y
8 `0 m  L' U& a6 s+ b, g) Rtar -xvf test.tar.gz
) v$ V# Y! h0 k5 w* xtar -xvf test.tar
' w! n0 T4 j" k$ H# {) o8 `解压到指定目录& D6 M2 G( @) Z. i6 F6 u3 F

' w- F: j* [; ^- j# \* Wtar -xvf test.tar.gz -C dir
" `$ L* N) }! B2 }tar -xvf test.tar -C dir' N# o. P( W$ C
解压包中指定的文件* `; g; c) ]% N0 a5 {$ W& d# e
- l$ h4 H% }( U) @
例如test.tar.gz包中文件情况如下:
/ ?5 Y" |) L* A; ^1.txt
& w, T' }8 M2 glog/
/ R+ l$ |# R4 s& Klog/1.log& x7 V5 l" N$ H6 ?$ J7 [9 w
log/2.log
8 z, }7 K, ]7 k/ |/ J$ q9 X; Ilog/2.log% t4 Y$ B7 @2 h0 `
log/4.log3 @; v" t" n6 u( E( n
log/5.log  O0 U: Q- z- c0 Y4 r
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:, Z0 B3 \# A/ _( ]8 Y& F$ x/ O* f
tar -xvf test.tar.gz log/1.log* O8 ]2 [  j8 ?& G# B$ l
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
1 M, T& _; x- \* I解压时去掉目录结构
7 r) l, Z, K- ]! w! G8 [) z8 E0 `3 |
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
6 a" o6 B+ k' a0 d: mtar -xvf test.tar.gz --strip-components=1 #去掉一层目录' V, Z0 v# \1 _: @7 Z4 T6 a, K8 p
解压时不覆盖原文件
- O( R0 b8 T& D/ T5 j
% [" B& D& @: f. c当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
# `- o% F+ h/ y- V" H* Ztar -xvkf test.tar.gz
" Q+ F' `3 C! l: J$ b特别提醒
* |, w; B6 }7 z4 S! F/ d- V$ |' r. ?8 s
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
* Y3 P. r( m2 G; m% e" `) Ezip/unzip
' Q7 q0 _3 z! z3 u4 Y
  r# N; g1 k* w; @' czip和unzip命令主要用于处理zip包。
% A5 R0 w+ j  I( R9 s! z+ Q压缩' G  F% ?& [  @3 {* e; F- @4 e

: ~/ ~# A2 |1 x! |4 X4 ]: k: j$ P涉及参数说明:
# h. r# N8 U2 }8 q- \6 ]-d 从压缩文件内删除指定的文件。
) k6 Y" K' x9 n- L5 G-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。9 [' o3 ]) p" b" V% q
-j 只保存文件名称及其内容,而不存放任何目录名称。2 F. G5 ~# V" I$ Y
-r 递归处理,将指定目录下的所有文件和子目录一并处理。  V9 G$ h& n/ t: U7 K, d: u$ F6 H
-u 更换较新的文件到压缩文件内。
' i4 K7 z3 I5 {5 Q  }-v 显示指令执行过程或显示版本信息。
' L" a/ Y+ j) j& y/ R* G, O-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
- C0 T- Q/ M! w. N4 t# B- n3 G2 U- <压缩效率> 压缩效率是一个介于1-9的数值。- _: D; O0 G0 ]; R- d+ l) E& C
压缩文件) y- t1 T- X! V& K. M; E
! p& H& M/ W0 o  u, t
zip -r test.zip test/ #打包test目录下的文件4 t, z. y& I1 K( D5 b
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
" M; A$ k3 Q( v指定压缩率打包文件
- ]7 \, W) H, Y4 a: p0 G- B. X0 j2 W+ ~: F% X9 d% P
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
2 X4 U( i4 j% b4 R打包符号链接文件
9 i: e( |1 u2 ]# k- t1 s
4 W/ B  j# `' ^! S前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:- |2 U  F% `/ Z) A/ i
zip  -ry test.zip test5 v) |" H. s: I6 |* i" I
向压缩包中增加或更新文件
' o  h4 |- }2 U7 ~8 g2 ^
0 x( ?' y' x* [有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:5 y8 S: J( L, K
zip -u test.zip test2 #向test.zip 包中增加test2文件
5 d' d, Y, R: I) l  ]压缩时加密5 ^, l4 c0 N) \9 [/ A  M" o
1 X  ~9 U- k; c" Y& k6 b
压缩时如果需要对压缩包进行加密,可使用-P参数:
3 @+ f7 v0 Z8 u2 [1 {4 rzip -r test.zip test1 test -P 66666 #使用密码66666加密
1 M/ L" d: N- i" f1 y3 x/ E: y删除压缩包的特定文件& S6 z  A( C  S  v7 U. x' b$ R

4 f- M! o' h) z# t# Wzip -d test.zip test  #删除test.zip包中的test文件
/ l! C# I( U. U" F7 m解压
: `. |( h# h+ C' a5 t' `! R- D2 E! t  m9 B  e& ?
涉及参数说明:
. _! b7 M  u  }. @: y' Y-l 显示压缩文件内所包含的文件' L& z; d0 a, `
-j 只保存文件名称及其内容,而不存放任何目录名称。+ {4 Q9 M3 G+ W% Y8 P
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该  H( ~3 a$ M, ~& w) |1 S4 s
-v 显示指令执行过程或显示版本信息。  u7 W5 F8 o. X0 q& h
-d 指定解压目录,目录不存在会创建
' T; i5 Y7 R+ J" `$ B7 e查看压缩包中的文件信息
& l0 L* x: @/ r. }, B3 U: p7 L) H' n( ~$ V+ y5 t; i
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
4 Z; i: X7 f6 j8 H( N5 {7 t3 E" Wunzip -v test.zip #查看更多信息,例如crc校验信息等, W/ C6 e1 S, R- Z) [( q
解压压缩包) I/ j+ a8 y( l, ~# y' [
  y, `9 q& e" |* Q
unzip -o test.zip -d dir #讲test.zip解压到dir目录
+ f3 `! I$ k' J解压包中指定的文件
0 X# Z# _( O0 A! Q6 t/ q
6 o8 x- z! N0 V6 B如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:, o  v0 ^1 V. A% t
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
8 \6 o7 [! R( R  ~2 nunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
4 ~% H) R1 z8 ?7 {# j& t+ D解压时去掉目录结构! j5 }2 ^1 Y5 E4 @8 N9 P9 S% d- _
* @1 O0 ], d3 ?
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
3 Z; M% p7 W! w( n% Fzip -oj test.zip -d ./temp  % s7 S% \/ c4 \9 q
解压jar包
2 |0 p9 N% o4 z; q- W: I% L, k2 P5 }* \( F3 w: k
jar包是java归档包,但同样可用unzip解压查看里面的文件:4 M/ W" D" ]' D) C6 U8 R
unzip -o java.jar -d dir8 U5 _+ F' q$ [/ K- `. m1 ~' j
gzip% m( D5 S8 R) V- \9 k& K, B  g
4 T/ |, V' h' i( ]- |
涉及参数说明:- d- J' s; m: O( T8 g+ F3 S4 y
-k 保留源文件# ]1 ]6 k& v* ?6 K! `/ K
-d 解开压缩文件( `0 s+ r: ?8 Z  I  e- t
-r 递归处理,将指定目录下的所有文件及子目录一并处理1 r; Q* F4 _; }: |! ^1 M
-v 显示指令执行过程
$ S1 C, v6 [' ^$ k3 A6 ?tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:9 S" u# ~1 H3 I5 T3 q- Q/ l
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包) W' P) f2 Q7 E9 O8 |
gzip -rkv ./* 递归压缩
% S. V& e) N' k解压也很简单:4 a" g8 I9 O, p  v( {+ J  S8 R
gzip -dv test.gz
& K% _4 }2 s, y4 r7 n" ]bzip2
7 Q9 c$ ~  p3 C" m: @: h) x5 M2 R+ f7 w% N0 M1 U
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:7 u% |" H3 Q9 k6 u
bzip2 -zk test  #压缩test文件
/ m! i/ L2 ?+ s, \0 |0 T$ B* x% pbzip2 -dk test.bz2  #解压
* d% J7 l. }& ^" q& a6 H! frar/unrar6 u4 z3 S$ Z2 S+ x1 n6 I5 M* J
7 Y- @- ]$ Q& n
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:) K! _- j+ k% t6 m  m$ y8 W' w, S# H- f
rar a test.tar test  #将test文件压缩为test.tar; s( ]( {/ q# e8 r
rar e test.rar       #解压test.tar# L* ~" P: }5 m% `% S
unrar x test.rar     #解压test.tar' r( A* o( N5 h1 K! e
压缩率比较/ `* ^: F9 W. m* ^7 K: C

' r7 h8 h) V, |压缩率一般来说:; c  ?) Q- R/ k6 Y
tar.bz2>tar.gz>zip>tar; S6 D# |( r' `7 Z! U9 Z
压缩率越高,压缩以及解压的时间也就越长。6 B  |$ ^& h- @1 v7 F9 a
总结
) }6 u% h( S( U% z. D/ f+ x8 g4 W. ^8 z# E9 ^  O
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
! x0 @( q4 V: C8 I; R有任何补充或建议,欢迎留言^_^。  c; P. Y1 t- }: }& \+ y

4 @0 J* u$ h- `% [" S7 K
. x! Z5 y! ^7 c6 ~+ l
) \: C8 a, l/ M
; ]+ N  F% n2 y! L: q! F

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 03:54 , Processed in 0.057085 second(s), 32 queries , Redis On.

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