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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

* F0 f; D% M: {' W
( X; }# Y) l9 e1 I$ s- Y6 L

% n: O0 ]7 r) \4 U" l前言
: k5 n8 f" E+ O2 H: u% Y7 u/ E2 ~) ~+ E* o
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。2 y- G+ ?+ F4 g# q5 N, B
tar
- T, g! k" z+ X+ `) G$ C! W- M& `, `! J' I! d0 T4 B7 g
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。$ c( f0 y6 }+ K" d. Z3 N
涉及参数说明:
2 M& ?1 c8 \$ q
-c 建立新的压缩文件
5 H  A, a; ?; J+ ?-r 添加文件到已经压缩的文件( E8 Y2 i9 v3 K) z+ D
-u 添加改变了和现有的文件到已经存在的压缩文件
  N4 z4 q: K) l6 {-x 从压缩的文件中提取文件
) o' ]5 x# H# l/ N-t 显示压缩文件的内容
- h, u4 N) Q% ~4 ?  F3 U-z 支持gzip解压文件% @3 S6 y  V- A+ r7 c
-j 支持bzip2解压文件
9 P1 r6 i8 ^7 l% U- H-v 显示操作过程$ l9 m* R* c/ q0 x) j  \# Q# y/ l8 s
-k 保留源有文件不覆盖
3 Y1 X& r  g" \7 E( g9 a2 f  c-C 切换到指定目录
6 o( _2 \; O2 H$ b1 Z' H0 Y-f 指定压缩文件
# n" ]" s. g  {7 Y  z( {( z6 ^. `% p/ s: m  t
--delete            删除包中文件
/ D, d, ^3 @6 F4 g4 J8 M  I--strip-components  去除目录! g8 U5 Y' S" t
--add-file          向包中添加文件, {. y0 Y: r# [8 C9 q
压缩
3 Q- P" |0 U" h  V& t
4 E$ J$ Y) k. f2 L- b归档tar包,不压缩
$ `; V3 k0 d* r4 |
: A/ H/ X4 ?* Q/ W( Xtar -cvf test.tar test1.log test2.log #归档多个文件; u9 X7 d# Z/ k; P, C& ]9 \
tar -cvf test.tar test/*  #归档test目录下所有文件
/ ]9 R& U% C5 I+ b1 b, d% q& O; ptar -cvf test.tar *.log  #归档所有以.log结尾的文件 4 d( Q  S! o2 T3 [& D
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
8 Q4 k# n* J9 F% L' I& e. Q归档并压缩为tar.gz或tar.bz2, @1 B( @8 w& m* M

6 i2 L3 x+ c7 N% j1 `, Q这种方式打包对文件进行了压缩:
6 n& Z$ `6 F. r7 t1 B! Utar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
8 b; j! ]! x9 _" gtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
! X& d% r/ ~! g" _$ u. `  J查看压缩包中的文件3 ]" f5 `. `' [0 s! H. H5 N' R
/ U) C7 r  j/ K6 E" K9 K
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:- a% U1 N9 g9 i* c* t
tar -tvf test.tar #可查看test包中有哪些文件6 x. ~# @. u5 t/ Q
打包后删除源文件% X1 y& v2 \6 K" ~7 _7 E4 i

( W( ]" e2 _" ~' u2 I/ B) [& `有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:6 s' |5 n. n, {$ m$ B
tar -zcvf test.tar.gz test.log --remove-files
/ [* T" O  u% N2 B& [% p) v打包除指定目录或文件以外的文件
' H! w7 D; Q, z+ y, F$ K
) R9 V/ k$ C9 \; K: X9 z, ^对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
  D7 }+ u& F0 F( Gtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件: ]& L2 [( T8 s
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。7 W& W" D8 C$ j2 X' \  g+ @
向压缩包中更新文件
5 A( z0 D0 O9 T. |3 X1 b. c$ s
2 h7 u$ r6 K: n4 Y# e例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
6 J. P4 C0 f+ }6 h! f+ w. T5 M. |tar -tf test.tar --add-file=test #只针对tar包
4 ~9 J# K- E* y- T- e, ?向tar包中增加文件
2 |" G9 d/ g$ l6 ^  u# V1 p
5 ^% v2 O# y- X% e& X" ^( x向tar包中增加文件可使用-r参数:# G1 g; ?( ?" N7 Q: ?0 }& B1 J
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
3 k' n/ ~! V$ K/ J& @删除压缩包中的文件" @0 N4 \: s0 k  T
4 G6 N, @  D8 L! Z$ z( L5 _
在不解压的情况下,可使用--delete选项删除包中的文件:8 O" t5 `) H9 b0 s" S- M( d, G6 b; a
tar --delete -f test.tar  test1 #从test.tar中删除test1文件' k$ O% a0 n/ N, L
解压
4 m2 t# i, n) p7 S
7 T" X) P' K+ e3 }$ i解压tar.gz和tar包到当前目录
8 F% U) M  E* E9 d9 l; \
4 l$ g( S  t$ v. p$ Ftar -xvf test.tar.gz- G) e; N# o2 a6 [' A* S
tar -xvf test.tar
7 a, }7 T$ O- j; I, g/ p解压到指定目录% a- f/ S8 V& q% Q
$ [7 ?& r8 E* [3 l3 g
tar -xvf test.tar.gz -C dir  M) `& a6 o/ _9 }# o
tar -xvf test.tar -C dir
" q- c, I' ^# z3 U8 y) L解压包中指定的文件
8 d" z3 p- |) X4 N! r; s# _
2 b6 {- L' F' {- U  o例如test.tar.gz包中文件情况如下:
  p0 d: q9 H8 o- G1.txt$ g4 `* h3 ]. C2 E! C- l5 n
log/
. e" g: p1 A: d& w3 K+ U: u8 N( Flog/1.log1 _9 U  }; A* U1 {
log/2.log# L9 W4 L+ [: ?
log/2.log) U; ^; i: `9 [' W3 {0 O+ L
log/4.log
& [! t9 f! f4 D3 p* B& |log/5.log
8 A5 w' B8 z# I如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:9 R0 [7 k0 E" M! i
tar -xvf test.tar.gz log/1.log" [- n$ W# B/ a0 {
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录( f1 r- ]* p1 T: R! _5 q! ]$ T, N+ X! @
解压时去掉目录结构0 N% I, ]6 K. Y8 `  t

* t! Y4 p2 D' I% s! L( b压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
1 D! V- n1 U# V  H2 B% `9 b  Wtar -xvf test.tar.gz --strip-components=1 #去掉一层目录7 q. C0 }& B- @' j' ?0 t( a
解压时不覆盖原文件
  e, i. m* J; d+ ?* _9 I
9 S9 q+ g& P; u当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
, u, W' k3 h3 S* O  H2 b! r: ftar -xvkf test.tar.gz
" c& k$ X' _0 p5 y$ X2 c! B2 H7 l特别提醒
; m: a) p1 v  {$ j* q- o$ B# O+ r3 ^) F0 u/ d$ t3 H6 o. N
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。" Y3 [: N7 Y8 R+ T% s8 [' O1 }
zip/unzip# P. R1 D8 g& a, |/ Z

2 t1 P5 ]; G" @$ Z& j  y9 N/ }! {zip和unzip命令主要用于处理zip包。" W5 W% F$ A* \- u! i0 r
压缩
) Z+ l) N- ^+ T
; O& g+ x& L" m0 C: }( Y# n5 c涉及参数说明:
! T8 N4 i& \$ d4 i) d2 D-d 从压缩文件内删除指定的文件。. [' E8 V8 K/ h3 X* Z7 ]3 s
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
* _1 s9 E: \& Z) z1 |-j 只保存文件名称及其内容,而不存放任何目录名称。
1 @& q' d- l( U! s( ~-r 递归处理,将指定目录下的所有文件和子目录一并处理。
' N) L% |& _; O, B! `: x2 O% W% V-u 更换较新的文件到压缩文件内。
+ o7 V1 B2 H) V) I1 {-v 显示指令执行过程或显示版本信息。
7 P* _0 ?5 t/ e5 ?0 n4 T3 |* H-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
# i6 \! l$ [" b# S+ E- <压缩效率> 压缩效率是一个介于1-9的数值。
, X0 O2 {5 F2 s压缩文件
6 B% |" q% A5 {* }
& z# S8 \. X' l4 ]) Izip -r test.zip test/ #打包test目录下的文件
, e" Q) A) v+ o% zzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
& W2 f& u6 N# ?7 L1 `' d( r指定压缩率打包文件
# h- Y. [+ A& e* j( j6 G6 j$ N* [7 O; P. M& Q, \
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长$ I$ K" O0 x& @) x* v3 _* {
打包符号链接文件
5 W/ \$ {. H! W/ G* @. ]) J! `+ z" b6 [+ `* r
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:! s/ v' Q$ ?( t. Y
zip  -ry test.zip test" r: x6 U: l' D" e' [; ^
向压缩包中增加或更新文件
. A6 n; ^+ E7 A' p" o. K
& }' O5 Y) W" Y1 [, v有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:2 _4 P# W; f1 L% `) C) {: j
zip -u test.zip test2 #向test.zip 包中增加test2文件
$ x+ I" }+ z9 b, W5 x2 b压缩时加密$ M# I/ g3 J- z& S& _7 i6 |5 B* I4 J
  l3 K7 z) W+ n  J2 c. b; @8 Z' X( u
压缩时如果需要对压缩包进行加密,可使用-P参数:
$ @# Z% @: d+ Y* l7 q# p: [zip -r test.zip test1 test -P 66666 #使用密码66666加密
* F0 V. z' H. [3 l' L删除压缩包的特定文件- z2 `% z" s. P9 I: L* t3 W

# W/ B$ B* x6 Z5 fzip -d test.zip test  #删除test.zip包中的test文件
4 U1 R! G4 m6 o4 Z9 p解压, F. V* K5 c" A4 S- [5 I! k; s
4 z' k/ f0 u7 w9 A( }
涉及参数说明:# R% z0 e% c, w# f% }
-l 显示压缩文件内所包含的文件
" ^+ J4 k* t! Q8 d0 q$ B+ C. V-j 只保存文件名称及其内容,而不存放任何目录名称。
9 ?- N. ^- b+ }# ?! ~6 G  h-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
; Y* H3 c" O! r2 j; F' N* `) d2 A) ]2 ]-v 显示指令执行过程或显示版本信息。$ Z) x( {4 r* J
-d 指定解压目录,目录不存在会创建
& ~+ u/ T* C: T0 P, l" G: m查看压缩包中的文件信息: s/ U: p: B" _  C7 o* d9 q& U
! K: M% W  I4 C
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息1 q0 `! z2 N1 J3 U
unzip -v test.zip #查看更多信息,例如crc校验信息等7 M1 c" E7 j+ x  q0 ?
解压压缩包( l1 a7 }$ x  D; h. ?  `" w
7 ?, e) K6 t2 z3 p: h, t; G
unzip -o test.zip -d dir #讲test.zip解压到dir目录
8 g, k; X5 x. `% S& m/ C& X解压包中指定的文件. Y) r7 _9 h7 z1 K4 g8 R6 T

% y0 Z; d( T2 N2 m如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
9 N' r: ]; r8 x7 wunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
# n- o7 z) Q- w& t( n- |  r5 H; k7 Wunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件' y4 o. A6 J7 _) p* |
解压时去掉目录结构7 n/ c2 {4 v& q- T4 ?' _2 q

4 F2 }4 }8 M- f0 o压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
, N' U: e9 L$ ?1 ?( ^8 y; wzip -oj test.zip -d ./temp  . z) p, }5 p) z, \! u, T
解压jar包
4 r4 \$ q; F6 }7 s2 N
6 ~: O6 w' H; z2 Djar包是java归档包,但同样可用unzip解压查看里面的文件:
, B" J, k0 A* O& Z1 {% P" f" Uunzip -o java.jar -d dir
5 y; z% g6 S" L' m/ mgzip1 F- B! P6 ~; v+ m6 h) j( z0 [- `
  f: |- E! `. ~% }, [  b. H# k
涉及参数说明:; D2 K3 u6 Q" P1 U' ?: y5 Y  x
-k 保留源文件
0 t9 l2 |: b% W1 U/ n. O-d 解开压缩文件
1 r. r/ z; Z' L2 r1 b( r-r 递归处理,将指定目录下的所有文件及子目录一并处理, ?1 _: ^- Y7 V6 i5 `; P& y+ G
-v 显示指令执行过程: ~) Y1 B" p" k  w% d# ~4 K2 o
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
5 [/ X1 l$ ^* m' ~gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包% |0 u; }; g9 X0 `* Z1 [
gzip -rkv ./* 递归压缩. k2 {6 j3 C0 I' D( `/ k
解压也很简单:. E. c; P! }" |, Z. R- [5 T
gzip -dv test.gz
2 d% ]( L1 A. V" i9 p. s" Ebzip2
& W$ q' b' c) Y9 T: s" q: T/ p6 Q
! H' h1 q: `6 A3 ~4 rtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:# k1 O5 W; J7 L+ g$ B$ }( T
bzip2 -zk test  #压缩test文件% N- `% R* E) T
bzip2 -dk test.bz2  #解压2 }$ b( W# x% {& ~$ b
rar/unrar$ a$ ^" E+ W3 f; L6 [

4 v& J2 [$ `( _+ _8 prar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:2 H" z7 X7 u( _6 f+ T2 p5 ?" B+ }
rar a test.tar test  #将test文件压缩为test.tar
$ @, @/ O8 v4 @- n& _  erar e test.rar       #解压test.tar
4 l2 L9 d+ L* \, v3 A6 _$ S9 dunrar x test.rar     #解压test.tar
: V+ R9 |) ]  t) ^: \* G/ ?* C压缩率比较! j3 P. h% Z& A# e

. e4 `: B, U( |压缩率一般来说:
4 Z0 `. N( J6 b: D. h* ytar.bz2>tar.gz>zip>tar4 ]% |% S; ^+ ]1 A; g& i6 D
压缩率越高,压缩以及解压的时间也就越长。" f& n5 u' K! o
总结# X' C' T7 ~1 o  _
3 B# B! f! p( \) e6 f3 j
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。5 K6 V9 z5 h* k/ p' x: Q
有任何补充或建议,欢迎留言^_^。
& y, t, f5 m  E2 W, Z; U# B4 f/ i# z

2 D# D# [5 Q/ X2 o4 Q; K. I$ I1 C( y. a

; g8 Z; v- N+ z( p! P1 q; _

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 07:30 , Processed in 0.047446 second(s), 44 queries , Redis On.

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