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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

$ D$ w4 s* a  N* z7 q
: j7 w6 i5 H- h0 p8 a( j
前言+ z$ [$ ^9 g6 V3 J1 X! c# H4 h% f1 U

4 B& ?; ]. ]$ E3 _Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。# ~" k% W" |8 p" ]4 @  D
tar" j7 Z. h" T+ b  I% g, a

3 e  ~- n* \1 ztar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
  s. @1 E* V7 c2 c涉及参数说明:

2 D" ^4 E. _& o1 e4 N-c 建立新的压缩文件
4 x- z, i$ W  {; Q9 ~0 k-r 添加文件到已经压缩的文件
( g. c) N: _9 Q) ]- l-u 添加改变了和现有的文件到已经存在的压缩文件
/ Q; ?/ |2 x2 r- B4 M( h# i1 F% B-x 从压缩的文件中提取文件
( |! o1 [4 x& `, Q( A8 @; Y, b5 ?- s-t 显示压缩文件的内容
% r  W8 W7 r4 G1 t; H-z 支持gzip解压文件4 Y4 F+ t: I4 Y2 m0 K; g, o. o/ T
-j 支持bzip2解压文件
  K- R3 j  Z9 o2 t-v 显示操作过程
" i3 K2 p" _0 Z; w1 A1 F1 `-k 保留源有文件不覆盖+ m& p" i4 q! t1 \6 |
-C 切换到指定目录* ~2 I' g7 e6 @: o) p1 v! K
-f 指定压缩文件
. q4 b9 g" Y# b: ]1 a6 }. [+ S4 u3 U+ z
--delete            删除包中文件
1 A( ~0 b" a( y! j- a1 D( H--strip-components  去除目录
: r, }% Q) }, F& X& {) ~--add-file          向包中添加文件! N  E" v1 p. }( v2 D! Y. B
压缩
5 `* R6 M  S" d" e7 E  @. o; p- |) p2 q* |1 t; k
归档tar包,不压缩
% H  B6 R. s+ X3 L9 G  M5 I" k
3 \9 `' Y, E! B- H) n4 gtar -cvf test.tar test1.log test2.log #归档多个文件
9 K8 d  m! V/ ~% {% ^tar -cvf test.tar test/*  #归档test目录下所有文件6 o( w1 H3 z2 u7 N3 X# I- [! r
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
  X! C% N) h2 Z5 C/ U5 l- y& J由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。. h* D+ I2 G+ \) I+ w( L
归档并压缩为tar.gz或tar.bz2
( {2 }! m: r7 o" }$ V/ f! `% G8 n1 l
这种方式打包对文件进行了压缩:) W: a( `: j: i8 U& W+ g; f( c
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
2 b) D- M4 y$ l- {9 S3 Xtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩& l) A1 L1 n$ a( \* b& k
查看压缩包中的文件3 z2 x, Y1 D. Y

% [" C5 q7 l/ B+ W) B; L4 \如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
3 ]) D5 |" e. p% h6 vtar -tvf test.tar #可查看test包中有哪些文件
) C/ w: s7 \& f% P6 d: G; {+ \/ y打包后删除源文件
+ n! I: n4 u' L9 R% D5 t. C$ @
* j5 i" W+ z$ _有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
% `4 g- `  n+ I" Ytar -zcvf test.tar.gz test.log --remove-files - _! ~, }9 a9 ~* K- l
打包除指定目录或文件以外的文件
( g$ w/ r8 M( r4 ?  n3 d/ r$ D
5 {' U/ j3 w+ y# e0 b6 Y对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:+ F' L! Y  x! n2 q
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件5 |8 M- W# Z  t- s( W/ X, Q9 H
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。1 {1 k: F7 |9 I# F( n& Y" H
向压缩包中更新文件9 G0 V0 _% @* S! u7 [1 Z3 z

! N' j8 a- w) P4 F/ }例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:* W* o, v4 H4 a4 i2 ]
tar -tf test.tar --add-file=test #只针对tar包
/ O% N, C! n  ^, B* N* x向tar包中增加文件
4 {2 W' W1 a$ n( l, E! P
2 z/ M8 x% b. @0 g向tar包中增加文件可使用-r参数:5 z8 O' m0 |: a7 g2 w1 [
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
- G, M: u" k& l$ d+ C0 n" E删除压缩包中的文件2 O" m9 ~+ J& w+ K- e3 n9 w
8 m( |" H- ]. e2 z
在不解压的情况下,可使用--delete选项删除包中的文件:
& u. ]# V2 ^, t8 Q+ ^0 L! N, u- |8 T7 q- Ptar --delete -f test.tar  test1 #从test.tar中删除test1文件
% l8 A( k1 `4 N; ]6 o! n解压' J' _6 J: N# j" h# h

/ X$ A7 M  g* ]解压tar.gz和tar包到当前目录
8 `; G) b7 Z- i. I9 t; {. I8 L/ p7 p4 X3 S' f
tar -xvf test.tar.gz
' ]" e) Q& C1 `0 k0 |+ T1 ?tar -xvf test.tar
5 }, @3 f) D' b. ]7 s解压到指定目录
" b, }* ~! g# W% t5 N! y  G$ t% Y) b! D- B$ V
tar -xvf test.tar.gz -C dir7 x, l% z: i6 D; M5 \
tar -xvf test.tar -C dir0 C8 z$ ?: ?( d6 S% E+ S" j0 b% f  z
解压包中指定的文件3 E8 U. O" k, b, P

% n0 J, W9 N; E3 T例如test.tar.gz包中文件情况如下:
. f+ e# f6 `* U8 n9 c, r1.txt5 `2 P7 U; R' y- D
log/0 t9 l0 p* m9 t" o  M4 a! w
log/1.log# ?4 w/ t9 o. g3 y7 H
log/2.log4 ]% q$ |- J8 W% o  \! Z6 R
log/2.log, e5 r& y) |6 s- [4 t! K
log/4.log
! C  Z! J+ U7 g6 Q7 r4 hlog/5.log
0 X7 @) C/ \; P7 v9 S* t如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:( `8 }  e4 H. O& Z" Z
tar -xvf test.tar.gz log/1.log+ d: [6 h0 U" r9 \
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
- ~" g5 t; q+ a) W7 q7 ^3 U解压时去掉目录结构( f3 E! F' G' k2 J

# H2 k: R7 j" S$ V" }; F7 g4 v) C压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
/ I6 s6 j0 O' a( J$ ]& Ftar -xvf test.tar.gz --strip-components=1 #去掉一层目录
) O) {$ i! ~: D解压时不覆盖原文件
/ b: u1 P  K; [$ A, g" D, y7 Q& j( M
$ z( P5 Y. W3 j+ D8 z! X/ v# M当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):5 x# G: X) d/ k9 h  M/ k
tar -xvkf test.tar.gz0 p6 `6 Z7 `( }! F, Q
特别提醒
% r+ @, k7 D9 z. K- }! d* Q2 |/ ]) _* {6 \6 B" L- z7 t1 W# z- e
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
5 D- F" X* c7 I+ t5 `1 rzip/unzip
. f1 L5 r' z/ Y# Z, ]. @. m% X. K6 r/ p, h
zip和unzip命令主要用于处理zip包。
+ {; D* }5 T' r压缩% h- {- a1 @  h# w

. h( o. b  z: ]7 ]涉及参数说明:+ |& {% P9 Q: ^' g4 W9 B
-d 从压缩文件内删除指定的文件。
. @: s( ]3 a( X! \& e6 `2 F-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。5 r8 q! T' e" Y9 U2 X& n; o/ K- g9 E
-j 只保存文件名称及其内容,而不存放任何目录名称。
% D  e; g* r2 I-r 递归处理,将指定目录下的所有文件和子目录一并处理。
# F& h2 p' v+ B( n- ]% E( V4 Y+ ]5 d-u 更换较新的文件到压缩文件内。
: j5 p& I0 H# b: D-v 显示指令执行过程或显示版本信息。
+ K# P* n- x2 k' V( N-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
8 t) a1 Z6 u% V8 A+ r0 {  V- <压缩效率> 压缩效率是一个介于1-9的数值。" s+ J. |5 r0 L; ]
压缩文件" s; O' M6 x8 i

6 l# G+ \0 j. [% \% Gzip -r test.zip test/ #打包test目录下的文件; x: C$ c0 [) W3 F
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录( Z* `/ U/ H/ O% d
指定压缩率打包文件
3 {7 g# i8 R: |/ {: {. W, z
7 p# \$ h) {6 s7 o. Y* ^1 }' Czip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
% d4 a$ m0 t& H/ h  u! M打包符号链接文件
. E- Q6 W5 B8 F/ ?6 }8 ?2 Q: |
6 d8 X3 n! O1 U! M前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:: t( }& n! @: m" j) `9 H2 l
zip  -ry test.zip test3 S+ K" f  c% G% c
向压缩包中增加或更新文件0 N. o$ E9 [& _! j9 D

+ S9 W. F6 @. k) |% r有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
7 r0 L9 Z" x+ P7 {0 t/ |% r5 xzip -u test.zip test2 #向test.zip 包中增加test2文件
2 a+ d7 M3 V+ M* a6 O压缩时加密( n& @) r4 R2 r" z
. Y6 Q5 P, a2 y- m; I$ ~' ], j2 v
压缩时如果需要对压缩包进行加密,可使用-P参数:" s5 Z* P! T1 Z% m" C7 N
zip -r test.zip test1 test -P 66666 #使用密码66666加密' A9 j4 ~1 j! Z) f1 O" W5 y( {
删除压缩包的特定文件( Y7 K3 r& u/ ?! W( q

' r" P* _5 A6 X# ?& a7 z& Dzip -d test.zip test  #删除test.zip包中的test文件
1 n2 {2 y9 R5 s% ^, h! E# }解压6 ~  C: V' ~+ C& S- Z7 p

3 M7 M4 S3 [* C% e  d* @! A$ j4 W涉及参数说明:
& o' I8 l/ t/ O) ^2 Y, i$ p-l 显示压缩文件内所包含的文件
9 E$ j& ]1 x5 s% s, f-j 只保存文件名称及其内容,而不存放任何目录名称。. a+ E$ g2 l& H
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该1 [- Y: z- \" a$ K% G- T
-v 显示指令执行过程或显示版本信息。1 j. C0 e2 B* l; i' ~4 K$ b1 ^% x
-d 指定解压目录,目录不存在会创建/ C0 R* ]) o1 f  L8 |" F  X- A' Z
查看压缩包中的文件信息
# k" A7 N# l  _2 u: A2 J: O- f5 y" `  A
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
- [+ S- l4 W/ g$ Z( p) eunzip -v test.zip #查看更多信息,例如crc校验信息等/ M7 x& T1 t, `/ b8 L; U
解压压缩包2 N7 h. m5 U( ?! \9 R
% _) ^- k6 l0 I* ?$ H
unzip -o test.zip -d dir #讲test.zip解压到dir目录5 v5 V& G# J1 b6 n
解压包中指定的文件
& p! r3 @- P/ b; g, O
- ~- \! q' G' |: F. t* I& ~0 z0 _如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
5 |/ R! R7 C# }6 s+ U2 ~unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录! `  s0 [& [5 Y; L5 o# Z9 M! W8 `3 e
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
! o* m  P+ W: E" ~' o" W$ }" s7 {& E解压时去掉目录结构
: ^0 a0 d8 N' W* _
! m9 e* {& L) m* d0 e3 Y1 s压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:' H* d! x  @1 F1 P
zip -oj test.zip -d ./temp  7 g7 b% |8 `* B& ?9 k" i4 X
解压jar包
5 r: o; c& `0 a9 V
5 a5 c8 o; Y! K% e5 Z" Ajar包是java归档包,但同样可用unzip解压查看里面的文件:" k4 X/ h6 S5 u7 q
unzip -o java.jar -d dir9 f4 [$ E2 u* [# ~
gzip4 T( O: E6 i3 b1 _

% z3 n* @* ~9 |0 G8 z* Y6 f涉及参数说明:
3 E1 d/ ]6 Z" X-k 保留源文件
3 a8 R0 i6 T7 f-d 解开压缩文件
! Q# X. O! `( Y9 C" v-r 递归处理,将指定目录下的所有文件及子目录一并处理
: ^3 I; p! z4 ?5 D& D) |-v 显示指令执行过程
/ R- n+ W+ S; M- f! {+ Ytar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
1 n! ?& d7 X1 D/ t* J# pgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
7 A  H* u' ?. ?1 R6 L/ ugzip -rkv ./* 递归压缩
/ j5 V# C! [9 z) Q3 y# O解压也很简单:0 o2 Q( k' s" G+ w
gzip -dv test.gz
3 s: m6 s) a" ~# L4 Obzip2
+ d% d; @& Y7 |$ w' F* F: ^
( I2 K/ a7 e' D  @+ G7 G7 Vtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:7 n$ u7 @: n) |) T& D
bzip2 -zk test  #压缩test文件' B% ~2 L# E& @
bzip2 -dk test.bz2  #解压, L( L6 t! r1 @: }6 H* W
rar/unrar
; q: j7 F' @+ D2 {0 m& i% C* Z+ d* a8 q! P
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
2 s4 \2 p& s% F* ?% Arar a test.tar test  #将test文件压缩为test.tar
4 W2 l4 a- o# T; V$ E8 }8 d1 qrar e test.rar       #解压test.tar7 \2 [4 g; S  ~
unrar x test.rar     #解压test.tar
& l! D2 D( V0 I" H压缩率比较3 W2 L3 `' `% D1 q$ ]6 C0 J
/ _0 @) c9 s/ ?
压缩率一般来说:$ i( v5 D/ v% P6 {
tar.bz2>tar.gz>zip>tar
$ g' s% C* u* i0 @压缩率越高,压缩以及解压的时间也就越长。& R" S4 Q8 R/ y' @$ d
总结
3 U$ w" [- L$ }$ ~
5 @6 @: M7 H/ W对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
* i& P, _4 k# v% A, b有任何补充或建议,欢迎留言^_^。
% l/ R2 p4 }$ T8 Q) e4 b) B. c2 [. o% o& l: ^
) f/ r9 D3 N( U5 z! a6 f
) V$ w& K" {! T0 f, D. v5 Z

. U9 s! B* Q% I! E. G6 o

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-29 00:50 , Processed in 0.076861 second(s), 32 queries , Redis On.

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