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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
& w7 {' E* \; q" J; w6 `" r* n& }  `

, O% w0 j, ^' O  ^$ _/ Y6 d

& f' N/ @5 l( N. ?6 A9 [前言3 S; l( H$ `8 o

5 e1 H8 ^& U% z5 y& b& U* P7 r5 aLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。5 `4 P6 y, t( d4 u- }
tar
1 d8 n0 Q3 D. p6 X$ R: p: M- F8 N6 m; t
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。9 s: r1 r8 k% }; s1 j
涉及参数说明:
/ K7 _. n: e  M- n
-c 建立新的压缩文件
8 M9 @8 {- v$ N-r 添加文件到已经压缩的文件
* C7 B/ C, P' _" Y  I5 S-u 添加改变了和现有的文件到已经存在的压缩文件! ]5 N3 O* g3 f1 m2 \0 g  L
-x 从压缩的文件中提取文件
3 t) l& Y% W. J6 w-t 显示压缩文件的内容
; v' y9 S9 g, ~; k0 _-z 支持gzip解压文件
5 W, R( O0 s, c4 Z, I-j 支持bzip2解压文件
7 I' j6 T1 @- q-v 显示操作过程) w  q5 i3 n+ J0 f1 Y
-k 保留源有文件不覆盖
5 p- x' [; N2 B% U% r4 r( @4 ?4 F-C 切换到指定目录9 O2 H  J& D: x& @  K
-f 指定压缩文件
- l9 j5 G' k9 d) t6 {0 f7 b  \+ x6 V/ b* I4 V
--delete            删除包中文件3 F9 R( ]% Q: i, U3 y
--strip-components  去除目录0 m( t2 n% Q; y4 u
--add-file          向包中添加文件) Q) S) n) F" t1 W, ?# D
压缩
6 f! \9 F8 V, Z- M9 x
& \0 ^3 w/ l) W' s3 _归档tar包,不压缩7 [7 Y$ f/ g1 p7 I7 N! V2 a

8 G( b( p+ p) f3 W+ d2 x/ ktar -cvf test.tar test1.log test2.log #归档多个文件
) |% U& Q, u6 ^# p  r7 {" Y% i: star -cvf test.tar test/*  #归档test目录下所有文件4 a- e% F5 _7 ]; Q- ?
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
( m3 m* W/ X3 m/ s' A由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
4 c4 n2 {: K1 B/ V) b归档并压缩为tar.gz或tar.bz2$ J: q5 {- Z+ e( X
2 G6 ]& F; O, n9 G
这种方式打包对文件进行了压缩:2 c0 C( Z' H* o/ t" c
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
! z; D3 U% r6 y' Q. i7 Z' p( D# ~tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩8 n( Y* p4 Q! L0 K, I1 ^- l
查看压缩包中的文件
6 S& P0 H$ }  ?% k, g' d
. _' m# W; {' r0 T( i如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
; W& W( r0 R! dtar -tvf test.tar #可查看test包中有哪些文件
2 i2 j' N  J! W3 u; Q6 t" o$ \打包后删除源文件
4 B' u% y5 `( Y
$ V* e% y# `$ j. ~% W( o有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:: M1 {& c+ Q2 n* V" r
tar -zcvf test.tar.gz test.log --remove-files 9 O! u: W' |0 Y! E6 J/ B* z$ s& d
打包除指定目录或文件以外的文件
8 N, j$ O" q' m' B
/ A! u( V  o8 l3 b对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
2 ^6 C+ }& e) Ztar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件% e4 D, h; l$ J. k3 e1 ]
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。1 E9 [3 ?- {: U
向压缩包中更新文件3 C( K3 O# F8 Q0 V: A5 T. K) M
* }' j' E  M9 \$ f; C8 x+ G1 B% l
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:6 |/ D3 F; ?$ T  ?
tar -tf test.tar --add-file=test #只针对tar包) x7 M3 @0 v( `4 N1 j/ J* r! j& A
向tar包中增加文件
. S  Q. _$ i0 [# R7 L* x8 Z/ M2 U7 K4 o. ]
向tar包中增加文件可使用-r参数:
! c5 w  }  z4 l. vtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
1 c) m( V6 x/ e删除压缩包中的文件5 }& I  Z2 F1 E+ C' s
; P6 z3 h! c+ I) n) X
在不解压的情况下,可使用--delete选项删除包中的文件:, G5 Q. Z" Q+ }% R
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
) Z" B$ j+ d) i: J& l解压9 H; C1 S* O6 K3 v

/ u; n" t3 v, Y& Q" T解压tar.gz和tar包到当前目录
1 D) r" k5 E, e, ~5 @5 p$ n; J9 g  i' h* _4 O
tar -xvf test.tar.gz, e8 r) {% o" a$ \, h6 A4 ?
tar -xvf test.tar - J" Z  {) ~; F( f) ~
解压到指定目录
0 s$ e& a4 |6 w1 n4 u3 U# V4 J; ^, U$ Q: Z
tar -xvf test.tar.gz -C dir- G+ _; V' M, L) M9 s" \
tar -xvf test.tar -C dir5 r) R- W$ n* u) v; J
解压包中指定的文件
* P" t; p; i/ m' r8 N
8 ]) j1 h6 w7 d9 c6 n' _例如test.tar.gz包中文件情况如下:
" ^6 ~8 l/ S" }7 v5 [% Y$ _2 a1.txt+ o+ r% c1 b) \  d$ Y' U! {
log/. F& E7 @0 P- Q$ Y9 n: t) B
log/1.log
, Y2 e' B. J7 ~log/2.log: n/ A% l" I( i( `) J& G7 ^
log/2.log/ c- G+ z- N: L0 B. A
log/4.log
+ S" v& Y2 I4 N3 p* K, ~3 Xlog/5.log) p5 `6 |& r4 i+ Y/ X4 N$ `* N0 M: v
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:, x3 n5 b3 R( n. e
tar -xvf test.tar.gz log/1.log+ h$ D# q6 r  o
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
- S5 A, A$ f2 R7 P* u; d& G解压时去掉目录结构, Y$ h3 X/ e, }& [- d( C' @( c1 ?

2 ~8 T9 b( c# E6 q( ?压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
3 w  t( e3 T$ I  r7 ktar -xvf test.tar.gz --strip-components=1 #去掉一层目录9 z0 H' r( t; U7 P; ?* W
解压时不覆盖原文件% `5 `& E) r  X( @6 l' h, Q
, ~9 z+ Y% k) n; _- q
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
4 I4 V% g% t* k0 ~0 H* Jtar -xvkf test.tar.gz
( |/ w( v# |1 G, t特别提醒
" m8 }( W/ f& X, @* U" `0 ^/ m, t# m) g, s. C1 M) X
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。- S, `$ @6 N& T- Z5 K* I
zip/unzip, E; T  b: M3 |7 K0 X/ W, G; T0 P

" y) [! |2 C2 u+ A' |8 wzip和unzip命令主要用于处理zip包。* X% M' X# S9 l7 H
压缩
$ c5 d$ W7 B: Y3 _+ ~) P) P5 V0 ~: r: B7 x. I7 V; a! i- `
涉及参数说明:2 w/ ~4 J, ^% M3 D! L3 X
-d 从压缩文件内删除指定的文件。
* e  F9 ^2 L) \# Z: v9 M4 u-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。) A& M! E6 }' d% M/ A0 Z4 s' o
-j 只保存文件名称及其内容,而不存放任何目录名称。- M5 Y$ ^. M1 O0 r, r: r) \/ n
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
# @# z" W. e3 S* ?9 l& k-u 更换较新的文件到压缩文件内。  }2 F- Z. {1 ?# O8 v
-v 显示指令执行过程或显示版本信息。2 L; n3 p, F! |. w- `* L
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。5 v# s5 O  d+ L0 l
- <压缩效率> 压缩效率是一个介于1-9的数值。- E$ R! S0 {- C. T( H  l: C
压缩文件: K% |+ C- `4 x2 K- k. v7 S* \
0 _1 X1 T4 u' s: a$ _6 t
zip -r test.zip test/ #打包test目录下的文件+ ~+ L! W" o. {
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
) t+ D- N  f4 X/ @指定压缩率打包文件
, W# J- I/ h/ x3 o6 M& d- g" @1 y9 K/ U5 T
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
$ \  s! D/ E; t' C: F% ]0 e打包符号链接文件
) Q$ h3 |3 B9 U  C+ ]) A2 y9 J8 k* g3 H" n
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:% d, R+ |& V) C7 K1 @
zip  -ry test.zip test
: d3 x. s+ L/ H/ ^; S5 y, h" g' K& ~向压缩包中增加或更新文件
' R4 c2 |7 h9 v
6 F+ C7 h* n3 Q) L9 @4 k8 A7 i有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:9 ~0 J# R4 b, ?1 q3 P
zip -u test.zip test2 #向test.zip 包中增加test2文件7 d2 J, Q2 e4 d9 z7 y
压缩时加密
% `+ L6 S$ e1 S1 U! k3 p- g. u2 u! _) \4 s5 w* f1 o, Q
压缩时如果需要对压缩包进行加密,可使用-P参数:/ f. H5 G6 `# k; o9 V, z- h& T. Q. J
zip -r test.zip test1 test -P 66666 #使用密码66666加密3 y, l" j; F6 \; _3 ]
删除压缩包的特定文件$ a1 H9 x& d% A. f! B
* F, m: O, u$ T# V7 ?8 C+ |
zip -d test.zip test  #删除test.zip包中的test文件! s" V8 p: l- T2 z" w- H  i* _
解压
/ _  p9 A+ c/ I7 n$ Y
. Z( `5 s: N& C$ H涉及参数说明:+ b3 r3 @( e; A( c. _
-l 显示压缩文件内所包含的文件3 G" E+ K- s% T, z
-j 只保存文件名称及其内容,而不存放任何目录名称。
& p% |7 U' B6 V5 v0 V-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
" q+ A- S( a! w, s$ T" X-v 显示指令执行过程或显示版本信息。
3 [( {% Q) l: d: h-d 指定解压目录,目录不存在会创建! S& n( ]0 J% S3 a
查看压缩包中的文件信息- y" g$ W1 B% x7 r0 S
8 [  O% W: }" T/ e' Q
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
+ L8 B5 E' z# D+ g1 Kunzip -v test.zip #查看更多信息,例如crc校验信息等
! O8 h8 K& ]6 V4 U解压压缩包
/ Q+ [  `3 f  ]9 j3 D4 n2 X5 Y' G) z$ K" x+ q
unzip -o test.zip -d dir #讲test.zip解压到dir目录
  M+ a) A3 ]' c5 g5 J/ G解压包中指定的文件1 _8 F  x0 _* s' _
: O  v! ]: o" F
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
: v. ~+ ^- v% g, n/ J- n% Bunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
7 s3 ?/ k& S. }& e; K5 Sunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
# u3 R7 r$ h+ j  j: O解压时去掉目录结构  G1 {, ?1 ~/ s8 M
& J' D7 j, y* m0 q
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
- t" c3 i% g! e: \/ W+ I: j# [; Uzip -oj test.zip -d ./temp  
/ H7 b. h+ A( I, p1 n+ V9 r9 r解压jar包7 s3 |6 R1 ~' {3 ?! c( T
- ^( g5 C/ t3 Z) e
jar包是java归档包,但同样可用unzip解压查看里面的文件:3 m) i( s' \' R8 L# b
unzip -o java.jar -d dir7 j# w3 N" l: K& S1 x
gzip) r* E- t0 _2 }. p! ^1 Y
6 a' R* E0 |8 k- L  A$ a
涉及参数说明:
, F4 Z  R* y2 L. ~! y0 |- m-k 保留源文件
6 Y9 c$ r5 Z& U' b9 z4 V/ b( I-d 解开压缩文件
* b6 d0 m! _& ]: e" a6 y-r 递归处理,将指定目录下的所有文件及子目录一并处理
5 f' b- d& Q0 L; @8 M) ~6 Q$ B5 Q-v 显示指令执行过程
. m( Z# G+ x  I  z. `) Utar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
9 E% a& z. T  w! S" V$ V+ _gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包$ K% Q' B" u" `4 m, a" T
gzip -rkv ./* 递归压缩
% V: u' ]6 ^2 P' A' m解压也很简单:& T1 |" u4 C: g. X; |( s
gzip -dv test.gz # W- ?( @. {- v
bzip28 Q+ M- t) i. H% J' f# g8 d

& I# k' g* r. a9 g" O0 h) x; gtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:4 ^+ ~' B( K, @& Y5 N5 w; A
bzip2 -zk test  #压缩test文件$ e  k$ H2 I2 K: q
bzip2 -dk test.bz2  #解压
* L) c! q" B! _' Y& Drar/unrar, t" b1 k5 X4 [4 d; v3 b

# i: I% E. M  b) r& v0 r9 Brar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:9 }- ?0 Z- b  r# `$ U
rar a test.tar test  #将test文件压缩为test.tar
) f, A$ t  j5 k$ q$ k+ drar e test.rar       #解压test.tar
7 v; x7 D+ R* j# q9 kunrar x test.rar     #解压test.tar, M: J$ o2 U: E6 k4 t$ z
压缩率比较
% y. ]6 R) e7 C/ P; [+ ]
. q8 w" Z4 F  w9 Y( U: \2 m1 v压缩率一般来说:9 x, M; ?) V( l: |3 q& U1 X2 I
tar.bz2>tar.gz>zip>tar
& B0 p6 R% a& ?" _# F. }% i1 _# N7 C压缩率越高,压缩以及解压的时间也就越长。% g! N# Q1 ^" C6 [: C
总结+ w% N) t' B9 Y: M; B/ D. w
) _! X- ^; @1 q/ V6 w
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。8 u" \; B/ x, Z% U/ m
有任何补充或建议,欢迎留言^_^。* g$ d; P8 ~$ K) p

$ T9 j* f5 O& K: u: j+ w( C+ ]* s- ?1 s% ^9 ]
. s! m$ E7 D4 ?/ q+ D6 B9 ^8 H

7 k: q1 J0 U  X3 e0 J

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

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

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