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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
# A+ b+ ?4 t# }

; z/ u9 E+ j/ r; Q: u; ]: ]- C
2 }$ C! w  E% {+ b/ k7 A# {% f# ~
前言2 H& v% _. N# [8 b5 \
6 q( _# d6 s. }( I/ |) G' p* P
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。1 I6 r7 x+ o# d( Q
tar
' h# K0 p/ o9 Z5 D1 K1 [% j7 C5 l3 o, l) N2 v0 l
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。; M8 Z# G; I$ I! H4 O' ~7 J, `7 e' s
涉及参数说明:
* {; |( C$ C2 f5 o4 V
-c 建立新的压缩文件
' A+ s+ `  x8 R8 x-r 添加文件到已经压缩的文件
7 Z: l4 k% E! j% b4 h4 R2 Z-u 添加改变了和现有的文件到已经存在的压缩文件/ o5 e, S8 R% M1 f, e
-x 从压缩的文件中提取文件
8 I% _+ w0 X1 {8 e( u8 b-t 显示压缩文件的内容. R4 l- y" M. A
-z 支持gzip解压文件: _# Z! ?! _# `6 U6 _
-j 支持bzip2解压文件
+ u( p8 H% S4 ]. m, C/ t) M-v 显示操作过程- f+ [6 ~/ K9 J1 j% v
-k 保留源有文件不覆盖$ f( r$ S2 Q/ |$ O% r- X! V
-C 切换到指定目录- i0 }7 n. x6 f( ~) x2 j$ G; a
-f 指定压缩文件3 u6 h6 o/ K& h$ A) e$ V

$ O, \8 N; Z* T--delete            删除包中文件; v# O1 Y* m9 d' R. C3 ?1 q, v
--strip-components  去除目录5 y$ r+ _2 k0 v  h, z5 \5 p
--add-file          向包中添加文件. b6 ^/ U# |; W. E; ^. g9 x
压缩9 w7 a+ l7 U8 F, H+ ~5 x; r/ E
: S) L/ d/ s( _9 u$ _: P6 r4 I
归档tar包,不压缩) b6 ^9 q! l" k, i" H

4 b. ?9 e8 t; P( m1 `; ~( dtar -cvf test.tar test1.log test2.log #归档多个文件
$ [$ s( }6 Y8 C4 l' W/ v) Ntar -cvf test.tar test/*  #归档test目录下所有文件; z6 g2 `! m8 ^, d: Y- X
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 ( l  X4 q1 t* f& _4 {+ O# O1 ^. F
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
7 [0 [; M" e" E! r: H6 O- p: M归档并压缩为tar.gz或tar.bz2) e2 l* W7 z1 t6 q

' G/ O9 z9 ?( Q" b, ], t/ z4 Q这种方式打包对文件进行了压缩:" }% u  `( A2 b% Q
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩8 w! n0 R+ O; c+ d: A
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
' C. N+ b: O0 I/ C  R* ^/ E6 Q8 F查看压缩包中的文件( k% s& `6 t3 _- K, [( W, C7 X

6 t" {  H: L% L/ Y如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:/ E8 r. W3 B$ B, J8 u2 F) ~
tar -tvf test.tar #可查看test包中有哪些文件0 v0 k, r- n6 _# m" M
打包后删除源文件5 C& E" k. ^/ V/ w. }4 W! ?
) Y) P  I5 F3 h( k( q  j
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:# D& f8 o/ M( M. ^& c+ S; f4 a
tar -zcvf test.tar.gz test.log --remove-files   C; I. d# f3 K' d2 T7 _" _9 e( c0 R
打包除指定目录或文件以外的文件# o% B/ j/ O7 j

# V- l0 s* u/ g( [& o对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:, g" E% S" o# k' u/ @4 \& q
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件$ s! L6 ]# F& X. V' F% o! l
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
/ K4 X* J( @3 N- l) l0 C向压缩包中更新文件
9 H$ |) B; {6 u. I5 x8 _/ I6 l. U/ L/ f5 U" A" F: K$ u
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:* a1 Q/ S. o8 u* R$ K* k( d+ U
tar -tf test.tar --add-file=test #只针对tar包; a  w6 h  n, n6 O
向tar包中增加文件1 B! T- g* u8 F
( P3 d# R  e6 R9 w* t! n
向tar包中增加文件可使用-r参数:3 E( u4 B2 P* W- H
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar& X) h  C0 R) ~
删除压缩包中的文件& @- _2 {- Q: K$ m) N( k- ]% u) L
: @! |- G- Q) l3 N, N
在不解压的情况下,可使用--delete选项删除包中的文件:+ U: q3 b( o$ E8 j4 I
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
, ?0 @, X6 t. F2 V6 l解压& K2 M0 C" c# I8 P
. Z1 \) b6 k3 p0 D- G* \/ t
解压tar.gz和tar包到当前目录) I4 K1 c) o) a) r6 S

$ L5 [1 b1 }/ |1 v( g1 S; Itar -xvf test.tar.gz( K- w& o; t, l2 B" T
tar -xvf test.tar
% k& |6 A; T2 |3 l. T) g* ]' X- M# {! p解压到指定目录
, _; Z- @$ k1 ]( C$ E# T7 Q& h5 j7 a9 x$ e3 Q1 p( l* {4 s
tar -xvf test.tar.gz -C dir/ [1 f+ W! ^. p' V' P( |$ }0 W3 w
tar -xvf test.tar -C dir
: \7 ]- ], z7 p$ C( x解压包中指定的文件5 ], D0 N! O* A- |& c+ G

- [$ c0 K  R# B# `, k! }; ?, p例如test.tar.gz包中文件情况如下:
* E# }5 ?. a) k# D! E1.txt" }8 F( D. Q; k- z
log/7 X" h5 R" x! ~  S5 Z3 [* P
log/1.log1 g8 G4 l/ @6 I% T5 b- k
log/2.log
( p" O; j- A' x6 l8 k- _& I& mlog/2.log
4 i$ R0 S% _8 K, r+ G, ylog/4.log
$ c1 y' n, u, d' F% ]5 |' T# Y/ Ilog/5.log
, n9 R9 j" Z- x* f9 H如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:! H0 R! T- k5 l& |2 K' c
tar -xvf test.tar.gz log/1.log
6 ~2 n  h( w* w) w  y+ Y7 P! b) Otar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录) r1 f2 q% e+ K9 F. E6 }
解压时去掉目录结构
) E8 f  G- a7 N8 k
/ a. u9 r' ^/ D9 a6 A$ ^' e. E压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
' q; {' e) o/ |+ h8 r3 qtar -xvf test.tar.gz --strip-components=1 #去掉一层目录' k, D2 H  V) d; m$ c# F
解压时不覆盖原文件6 @  r. Y; }/ \; \
+ N: D, P9 K$ J; G
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
0 f4 A* E; U! m' J2 b' |tar -xvkf test.tar.gz
  W  ]& _3 ^4 D0 o1 e9 }特别提醒# x: C* L" U6 n3 c

8 S2 ^5 }$ v$ Y/ k# u, n7 e前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
+ v* W: D9 e7 K# y, {3 [- A6 Dzip/unzip: R- H8 R' ~4 k$ |. o+ y
1 `7 e) J' F5 V) c# K7 X5 k- u( j
zip和unzip命令主要用于处理zip包。" N$ y# R* e* ]1 F2 Y
压缩
; l( n) c" C. R! {, t, L" h; J
( h, H& M6 H: j4 N, u: F涉及参数说明:8 `: f/ V" E" B9 r" ]# W
-d 从压缩文件内删除指定的文件。( a7 [0 O( S7 T! l
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。  C) P. r- E: [2 [3 f% [5 b' S
-j 只保存文件名称及其内容,而不存放任何目录名称。
3 K& d" c0 q$ Z3 z-r 递归处理,将指定目录下的所有文件和子目录一并处理。& k6 D- x5 J2 v( h/ U: L+ P
-u 更换较新的文件到压缩文件内。2 X) r- C3 K% t5 P- G
-v 显示指令执行过程或显示版本信息。
$ @4 _7 S2 r, _! p/ J5 e; ?5 V-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
2 R' Z$ X' R% n8 X; Y( r8 ~/ H- <压缩效率> 压缩效率是一个介于1-9的数值。
) W" w3 H$ }& Y6 v9 Z压缩文件
2 t6 M+ ?, i. F; {% _6 n6 y$ a" ]8 ]& I+ q5 s; |7 \
zip -r test.zip test/ #打包test目录下的文件
: s% W' b* }, g) O! L9 D; v# hzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
7 h3 V& X; L! ?0 y1 h% l指定压缩率打包文件5 Q# T; B: t% [% F5 I  r0 Q
3 V& j0 Q: Q: ]/ Q! D/ L5 {
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长. F4 W/ T+ i0 k8 u; w3 i/ l/ x
打包符号链接文件
& d% n+ ]4 c  j( ~+ s
8 [" b1 C5 [4 F- b前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
/ ?% Z7 e* g2 z: P9 _% mzip  -ry test.zip test8 y0 T- X) n! ^) T0 Z( Q
向压缩包中增加或更新文件
0 n& S6 c0 \! Z# C  K+ t/ P, P) n! S' t9 r' M2 d
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
! L! v4 v, B8 i" @9 ~: @) d. lzip -u test.zip test2 #向test.zip 包中增加test2文件
) h: W! Y9 @- G! |5 m( g8 ~* u$ V压缩时加密
7 n+ A8 @: Y: a1 l3 a# R4 U
3 r) s( _4 N1 ~4 ~压缩时如果需要对压缩包进行加密,可使用-P参数:% J- q6 H- u0 N9 J4 A8 B
zip -r test.zip test1 test -P 66666 #使用密码66666加密# @1 I* E2 b3 v& d! g
删除压缩包的特定文件
9 e$ B3 N+ K; a0 F8 d& {& h+ T7 t7 d  t6 O
zip -d test.zip test  #删除test.zip包中的test文件! l- W  q5 t5 Z7 @& [
解压' Z& y# _5 s6 u* A" n' ]

: T1 W. M$ _0 w( F- Q涉及参数说明:
4 w4 K' l( l" I4 J0 ]-l 显示压缩文件内所包含的文件
1 W8 A- v9 Z6 \4 U$ Z( f' N9 [-j 只保存文件名称及其内容,而不存放任何目录名称。
' W; U; N6 N3 r( ?" i5 L$ I0 k9 w-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该2 B5 d6 P: V  A; j; D. {2 Q
-v 显示指令执行过程或显示版本信息。% x& k8 J  ~; d$ S. }; z+ U; F$ }
-d 指定解压目录,目录不存在会创建
* s& X" w" C) M8 k2 e( t) [0 \查看压缩包中的文件信息
( ~- [; ^3 V' U/ T4 G3 H8 `
+ ^8 V' [6 z! `unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
# ~3 r5 D5 V# b2 p1 X# S8 b( Yunzip -v test.zip #查看更多信息,例如crc校验信息等
, I( q. A: E: l  s5 P  K解压压缩包
5 G# h7 T- V* u* m# @" u# n- v: y7 {
unzip -o test.zip -d dir #讲test.zip解压到dir目录
+ v6 U4 F* ^4 J0 s$ t6 h  P$ C$ `解压包中指定的文件
5 Q+ i* ^2 J) r7 u4 n! f, I
2 O9 G: B' m; R7 V2 b5 {5 ?如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:. Y  b% V0 i4 J* K3 q
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录: O" Q0 h4 Z3 R8 U
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件1 m; ]2 W# k) f. H
解压时去掉目录结构
; V& o' ^7 A) R! v) P& K- @: e# {+ H
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:& S+ K' k: u% ]
zip -oj test.zip -d ./temp  ! P- J+ L3 n% [* ]
解压jar包
5 y8 N% j( j9 F# u6 _4 ]5 }
! J" }5 P5 d  u1 I& i' x1 Q7 y9 g! T3 Njar包是java归档包,但同样可用unzip解压查看里面的文件:
/ G) {1 j3 g: }4 ]* W3 Munzip -o java.jar -d dir) q. y6 O( L8 j) A. _' r7 n' H
gzip+ y. j* A. Y0 b  d3 x

1 n# J& ~' [+ W' K: h' Q% I+ n涉及参数说明:
* F0 ~/ @6 c8 R4 U+ ~: c-k 保留源文件
, U6 Q1 `- i) ^# M8 S$ R-d 解开压缩文件7 n1 H. w/ E  A; B4 H4 k  y1 R
-r 递归处理,将指定目录下的所有文件及子目录一并处理5 }* }, z5 H8 C: V1 u, W
-v 显示指令执行过程1 X5 N& v' w/ H, y  i& j2 h" r5 [6 P2 F
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:; [$ v. b1 f2 B: b
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包# v7 Y6 N, a7 l8 R
gzip -rkv ./* 递归压缩
! }1 M; ~, A; B: a3 w解压也很简单:4 m; M. W$ x* b: t
gzip -dv test.gz
( Z0 g, |, j3 `; e1 r) O# k& N8 ebzip20 u* ]6 ]% z1 O2 [" z' n. q1 V
* n& C; u7 D) V* k& n
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
6 D" B' Z8 e2 ~! obzip2 -zk test  #压缩test文件
) g/ |, h. w( L, }/ ^bzip2 -dk test.bz2  #解压2 s! l5 L# w: J/ k( ?7 `" Q4 p8 K
rar/unrar
: [( ?  ^  S1 |% m/ t$ w( w; u/ W/ L6 q5 i/ N" a/ f# o  D
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
( [, E5 d2 `, @3 @' I: R3 ^' ?rar a test.tar test  #将test文件压缩为test.tar3 P: O9 c' j+ C# ?% a; c0 K
rar e test.rar       #解压test.tar- V1 H" A1 F- y2 Z
unrar x test.rar     #解压test.tar" m% |6 I# Z  k( A
压缩率比较
8 L5 W* t, m8 V+ _$ \' C- y8 q  B2 d/ |3 P. A  D  j
压缩率一般来说:' d6 h8 a  T& O9 ]8 N9 L6 w' _' F
tar.bz2>tar.gz>zip>tar
5 `# S/ ]7 ~7 C压缩率越高,压缩以及解压的时间也就越长。
- k7 A4 J3 q; z" j总结: @. w5 A2 _5 _  z" `

9 g: ]4 c2 C5 Q6 D  j+ s% L( o  N6 I对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
7 n% w* _) d: v* _6 b3 G! M有任何补充或建议,欢迎留言^_^。; O: n! Z# V2 t2 [1 @! z' L

  f$ u! F; b% C5 Z3 y( e3 @/ M/ q2 U9 z$ z0 l% @- b
8 Y) [9 n6 f! W* V+ f& J! l" _
: N' t- u0 D1 w( J, c

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-16 04:30 , Processed in 0.063547 second(s), 32 queries , Redis On.

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