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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
& s7 N' l5 i5 t( Y- f
* W5 F& i( W" Z) t- R; ?
& t9 |# @7 I" q3 s. L! w
前言( A7 J4 s/ T; ~

( K8 m$ B! _5 ^# E6 U5 KLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。  u  m( Q0 Q- ~/ T, }. T1 A; d! ?
tar
, s# t: o6 {1 \3 c- Z4 o! F9 M$ v8 q8 S  b& d! L8 a& t, \  Z2 w# @. m  _
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。  F/ s# n3 [9 b1 j* F' }/ J7 ~
涉及参数说明:

3 w# z% \/ A& x9 d4 j" E' {) z-c 建立新的压缩文件
, G, M: h6 z* p5 a( N8 {( K-r 添加文件到已经压缩的文件/ {* p7 g4 o# j( {
-u 添加改变了和现有的文件到已经存在的压缩文件% E+ b6 u4 h% ~. h" ^8 H
-x 从压缩的文件中提取文件
' I% W0 u) _4 Z( }; S-t 显示压缩文件的内容
/ o( ~+ y! x0 y0 _$ q: a3 L- ^-z 支持gzip解压文件: b+ z: m$ }4 f4 M; B. e( J3 s
-j 支持bzip2解压文件
% J3 F- H' h  e- s" W-v 显示操作过程
6 M! z" k5 W( S- P1 J-k 保留源有文件不覆盖
0 Y5 h" n; M3 Z8 s/ X% h3 h-C 切换到指定目录
8 Q9 s  d/ m: n& B" I+ a-f 指定压缩文件" f! d* J8 w9 v# q

, B# C4 O' M  L0 {* k* X--delete            删除包中文件5 M# \& n& {- G
--strip-components  去除目录) @5 u6 j- L: I' [: m" P6 r1 ?% Z
--add-file          向包中添加文件- B) K/ q2 M2 P: V% t
压缩% n, V2 j8 F. _0 N5 R6 s; m
7 x6 L) f4 P( K! f- t/ W% H
归档tar包,不压缩1 ?! O, n, b6 g2 J

# c, u+ n# F' Dtar -cvf test.tar test1.log test2.log #归档多个文件# X, v! Q+ c- A
tar -cvf test.tar test/*  #归档test目录下所有文件* ]. Y2 }- w& g1 _) J% k( x7 {" U! U. |
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 9 l( Q1 y3 Q' N  n3 i: f
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
2 G3 B3 w7 u& C  b归档并压缩为tar.gz或tar.bz2
5 a/ J/ x0 ]7 H2 |2 _
) n9 ?# B5 d5 V1 z& Z6 F) l这种方式打包对文件进行了压缩:: ]: ]8 y4 {# \- Y' X. N
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
( y% Q9 S; |. R% x' Q* ptar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
. T; y- p2 S( d) D+ \( t; q2 _4 a查看压缩包中的文件
: G7 e! J. h/ Z  p# x
! b5 U# {, l0 P" c# N' B如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
0 {7 H+ q5 {) w' W2 {tar -tvf test.tar #可查看test包中有哪些文件0 o0 K3 B+ V. Q# F8 a5 {3 ?
打包后删除源文件7 ^4 {8 k& x0 e6 W: l8 Y' L0 G# S

- D, A2 k- F- M7 Z  E有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:6 O. b; F, M( Y- D+ }: X7 a
tar -zcvf test.tar.gz test.log --remove-files
) z1 a3 G) P" p- U- R打包除指定目录或文件以外的文件
0 O1 ~( O" Q, d8 P' l. |- P2 H3 j7 T" w& ]. g$ y: s: t
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
( n- \* H4 V" `tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件, U# ~& w% l1 z! L: ?( Q
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
0 g* A0 o! r( Z1 m. J4 }, x3 m向压缩包中更新文件+ r5 c" q2 [4 \5 t5 v6 W9 d4 m& z

9 Q  g6 q- W/ p3 E1 ^9 J- g例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:) E1 O+ t' i; |6 g
tar -tf test.tar --add-file=test #只针对tar包
. G  l7 A) o' i% P- x* u, K5 ~7 F向tar包中增加文件
1 ], n) ~  k  y" W  G1 f8 T! G' p& n
向tar包中增加文件可使用-r参数:. \0 @6 d  `' k2 y1 a& w7 Q7 x
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
6 y. l5 N0 [1 j7 g4 y) }$ L删除压缩包中的文件  @- c- @9 A3 [- l, N
( w& \! ^$ M1 E! z9 j. s
在不解压的情况下,可使用--delete选项删除包中的文件:
: `( P4 `3 j5 n: H3 itar --delete -f test.tar  test1 #从test.tar中删除test1文件
- a& q+ [. t* o4 E( r解压
$ u2 \7 b: R# [- k: @
7 ^3 K9 p# @) [; H* a解压tar.gz和tar包到当前目录3 H, b! `& V7 z; I5 N
! s) I3 B: L0 @& K% r8 o+ I+ {; O& ^
tar -xvf test.tar.gz/ P/ e! @# Q0 I2 n& f
tar -xvf test.tar 9 v0 |2 S8 x! K9 j8 I8 [' ~0 }
解压到指定目录
. h5 L! D2 ^0 }  l& `
7 q; C% V7 X' Rtar -xvf test.tar.gz -C dir
& f9 ~, e) E( r# g6 Dtar -xvf test.tar -C dir4 x- i$ h+ @' n+ u  N: a" D
解压包中指定的文件% t" q# {7 R& F8 b4 r
6 X, v' d: [7 H1 J4 a7 W0 f. S
例如test.tar.gz包中文件情况如下:
3 O7 |5 F) g& g5 [- ]; w! U1 \1.txt
( ]1 N  S" }+ L3 [9 R& jlog/# @. Z& ~5 B2 ~2 y1 p( n
log/1.log! |9 I( d3 X+ z( y3 \2 k. y" M
log/2.log# ~4 l8 ?# P: e  m
log/2.log
& H& P. J/ j& v0 b% Tlog/4.log+ r  D* W& \6 i' z
log/5.log
3 i" W. J2 y& E0 t. P& }' T5 m& I如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
& W5 a! o: G( F# C2 ^, Z7 Btar -xvf test.tar.gz log/1.log( h5 y2 C, {7 b$ Z
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录( K5 \7 S. o2 b/ i
解压时去掉目录结构' y& B; Q  [6 i0 u
9 \4 e# s/ S: |% f2 t
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):9 a# [; E. ~2 |( j% k  Y
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
9 k% ~: D: q- g# K解压时不覆盖原文件
/ A# n9 `, A6 e+ T; O5 {: C5 q) N0 G, ^6 P
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):4 u- T' o6 t1 x3 Y/ e' ~0 X0 f
tar -xvkf test.tar.gz
' V: w5 e. i3 Y( }) w特别提醒3 h( E; X9 M6 a# M! G+ w

+ e# S/ k- p" T9 w; [8 ?前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
; i0 |) Z- g: f7 ^- Szip/unzip. X: d- m, {% I3 i
  M2 H2 z/ H9 w1 T' ?2 m) ?
zip和unzip命令主要用于处理zip包。
, z0 Q, X/ S. h1 N# L# [) Z压缩
7 a: E! g3 [+ v% Z7 _7 g$ M* Q  e$ d; M* q6 \1 |+ ]1 Y: J
涉及参数说明:
: M- |% N; x" F) [7 `-d 从压缩文件内删除指定的文件。( g9 q$ k: r0 n6 `4 g
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
. E( G- J1 ?& J' W/ _-j 只保存文件名称及其内容,而不存放任何目录名称。4 M* E& I5 o7 p/ u$ e/ V$ ^
-r 递归处理,将指定目录下的所有文件和子目录一并处理。& `4 I1 I2 E$ g* T# G
-u 更换较新的文件到压缩文件内。" g: Q4 \0 S, p' f* c5 `
-v 显示指令执行过程或显示版本信息。
+ I) H$ _# B+ `6 v/ ]-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
7 k7 A2 |; |- P( t. x4 O8 l- <压缩效率> 压缩效率是一个介于1-9的数值。
% n: P! T) m, |9 o' g" l压缩文件
7 b, v+ T6 j: `2 v# z% P6 R" o! I) B" Y/ b2 Z! k: v. C$ X
zip -r test.zip test/ #打包test目录下的文件
, L' ?. Z9 S1 d7 M2 K; Bzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录) n; r1 g5 B+ a3 i+ ~
指定压缩率打包文件
5 {& k% @3 w$ q' y
. r/ {" l2 l! D  pzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
  Y$ l' @) X) v5 a% @7 r4 K: |' H打包符号链接文件* }' [0 g( F0 S5 W4 q

: m2 o3 Q. l4 I* H4 U, C前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
5 Y( }4 c# d# C5 R4 w8 h4 Uzip  -ry test.zip test
3 u9 T  o0 n4 o# |  Z% |7 H向压缩包中增加或更新文件9 T& X7 e' Q& @# R8 M

3 ^. v) E& c/ D7 ?3 N6 e0 x/ U; F  P( d有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:; F. f, m& v3 Z* T
zip -u test.zip test2 #向test.zip 包中增加test2文件0 b" U% Y, c$ T
压缩时加密4 }6 q. |: o# x$ _! u

" G: U. L! S8 ?5 [" c4 k压缩时如果需要对压缩包进行加密,可使用-P参数:
) |4 e$ z+ _- azip -r test.zip test1 test -P 66666 #使用密码66666加密& m( x. c1 V" ]6 Y3 F
删除压缩包的特定文件
" q/ w9 g$ g+ R% W' ], a; ?  G# s: j+ ]1 n& s  P: L# y* m
zip -d test.zip test  #删除test.zip包中的test文件) C. r$ e/ `/ Y. N, y4 N
解压. M  A( J- o/ {% M0 S

0 t2 J3 ]) \: Z! T4 R- d涉及参数说明:
! {0 }& H5 ~1 z1 m-l 显示压缩文件内所包含的文件
3 [: Y5 @, T- Q' [- P4 b- p! A6 i-j 只保存文件名称及其内容,而不存放任何目录名称。
9 B" f* O  d% F; G4 t& S-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
. G6 Y9 V' U! c8 R6 A-v 显示指令执行过程或显示版本信息。  b; Z$ d" H( g. j) ]
-d 指定解压目录,目录不存在会创建5 Y0 Z/ r1 l3 H$ l7 g
查看压缩包中的文件信息
( L- R9 S& \+ r& V. f0 I, m+ g0 C) o* `+ Y, \
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息  a/ G& o* W2 r
unzip -v test.zip #查看更多信息,例如crc校验信息等& z( Q/ Y4 ^7 G2 N& K8 ]
解压压缩包
6 p) c* g1 Z/ @# E0 i( O" p' a- K2 [% {( F! G, y9 S
unzip -o test.zip -d dir #讲test.zip解压到dir目录
9 D: [% E% U# w$ J解压包中指定的文件  i* ]1 t; }+ {! f5 ]

' D4 k9 y) }) a9 M5 S) A, w; `' H如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
- J# @, }. t0 E0 I' `4 nunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录/ i+ w* n& _* g' G4 P" ]
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件+ j0 B1 q; Y7 j0 ?3 I4 \$ `
解压时去掉目录结构8 K- C4 l8 q7 H/ B6 W
# }4 A% \  \0 |; q% d  E
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:! U8 @  m( K* G. W6 {
zip -oj test.zip -d ./temp  5 e; b+ R/ T& @  u* u
解压jar包! x1 B! N( o+ u+ [) V6 ~% Z
6 J0 `) h& [7 o% v. J; T9 ~+ g
jar包是java归档包,但同样可用unzip解压查看里面的文件:
4 G' r! r1 H7 Bunzip -o java.jar -d dir
! L, a; R, }! y9 w9 x! V5 Jgzip
5 u" j+ g) z1 c8 Q! C6 ?* L' e- M# E) W  \+ _+ u3 w
涉及参数说明:
6 D# |! {% @/ a1 G" G-k 保留源文件7 _: {  M! i% }. t+ L) D9 z: {
-d 解开压缩文件6 [' p" G: O) C) q7 k8 `) I) e6 l
-r 递归处理,将指定目录下的所有文件及子目录一并处理
- X, e0 ^2 c  v, ]- `/ p-v 显示指令执行过程$ s( h* J+ o3 q* Y
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:& |. n& {% R2 F- M4 f( C7 U
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包3 g6 ?. c& {+ w% B3 j7 z( v
gzip -rkv ./* 递归压缩
; t+ j! ~2 |! l/ O" o6 k/ e1 Z( c解压也很简单:
( _# E  t0 [: W! p+ Xgzip -dv test.gz
1 G/ @  [3 X( }% rbzip2; M( U. P& m+ J9 o$ B& l- B0 |

2 `3 x7 k$ t5 b) M, Dtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
8 w  A1 T- [+ f5 Kbzip2 -zk test  #压缩test文件
2 P$ J  F( ^' y" a# c) c  hbzip2 -dk test.bz2  #解压+ v" T: |& B' P9 i7 g
rar/unrar
$ |3 e! n1 {4 |/ |( R( j2 y& R+ J/ L  W7 e
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:+ p8 T, ~- m$ ]! I
rar a test.tar test  #将test文件压缩为test.tar
$ i6 n( B7 |* X$ t& drar e test.rar       #解压test.tar9 ?' P0 w, S, t# K, n
unrar x test.rar     #解压test.tar; t" B& I9 P) a2 h5 ~
压缩率比较' f. `9 N) k3 F/ h$ t, L' m% Y
& u/ n& @( A7 ]. o  D3 @
压缩率一般来说:
( L8 _3 c3 F8 w% v( N* Star.bz2>tar.gz>zip>tar
0 U. m. ^8 M: z# [( q* w1 i压缩率越高,压缩以及解压的时间也就越长。
2 ^4 X, H! ?! S3 m3 M/ a+ E总结
) ]# P+ L( w# s" h  ^! @! s4 }( R) n8 A$ J
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
+ W- D  m0 X4 T6 b6 n3 f: q有任何补充或建议,欢迎留言^_^。+ n6 l; L9 g: w2 }

7 M& I+ L* A0 s8 W, s1 L" g! x+ O# [- K& L' F

% m0 n7 d  j- j- E5 j- u& D  w
" w3 M( ?) d/ j% }

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-26 16:38 , Processed in 0.064714 second(s), 44 queries , Redis On.

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