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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

6 k6 j! O6 S) o6 ?" L' w3 G$ @  y" n' B

5 I6 J, R: ^  f前言
  r' N5 s3 s, K- p! p7 E" G
( F4 F2 t+ @- @1 q8 FLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。( i) S# p8 ~3 Q7 n
tar
% X! N) s  i+ x
9 n" ~) W! w; x& ~' [tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
; u% j3 k% T$ g: C. x7 u涉及参数说明:

7 W# M4 Y3 `- t) }( u2 t: \-c 建立新的压缩文件
% d# e/ [. Z$ n9 H+ M% b. ~0 A' r( F! r-r 添加文件到已经压缩的文件! C* K) l1 c2 P. c% [
-u 添加改变了和现有的文件到已经存在的压缩文件& [! V0 Y& ?) v2 Q, ^/ @
-x 从压缩的文件中提取文件
  M, p4 x% ?9 C9 k" n-t 显示压缩文件的内容5 D! j6 B, X% w; v
-z 支持gzip解压文件/ S) W& n- D0 B7 g1 Y
-j 支持bzip2解压文件1 d) }& Y, ?7 j: J7 y9 W8 h
-v 显示操作过程" n% ?1 D: \" d; D! O
-k 保留源有文件不覆盖
7 Q* {+ d' w% A" D-C 切换到指定目录7 z- N/ y) o+ k4 n& l
-f 指定压缩文件
( S% s5 d$ r' ^
( p" G$ ?5 D" B0 |4 E" q5 m' I' M--delete            删除包中文件. e9 N9 Q: I8 _$ g: T( L, `
--strip-components  去除目录
1 g4 F& H- }: `$ ^--add-file          向包中添加文件
( X' i9 x- U' {. `: z压缩
2 o+ C1 l* m, b! y& M; j" `
3 L  t; u6 c1 w0 q归档tar包,不压缩
. T+ s' G4 r3 s+ c" @2 T
) c2 r# ]* P) [) U- Qtar -cvf test.tar test1.log test2.log #归档多个文件4 h6 V' g7 K6 n& w) o  Q
tar -cvf test.tar test/*  #归档test目录下所有文件
3 @; ]! N! z: H9 H  wtar -cvf test.tar *.log  #归档所有以.log结尾的文件
$ Y( B! ?% |, C6 F) G由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
9 O  K, c& X1 k* _& X归档并压缩为tar.gz或tar.bz2( U% _7 k  d& R4 O- ?
  ^0 W) H( I( ^: w% g- p9 s
这种方式打包对文件进行了压缩:
7 Z8 A. m1 J" x1 e) D' {* C, Star -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩3 P' k$ K$ L0 c2 M0 J6 i; g
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
/ c2 e5 M" X9 f( L7 z$ l查看压缩包中的文件
) b- x; D- _& }: k- ^" j" c& T( L4 Z  f( @4 J/ ~
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
. }' t3 N" @+ r8 i  Q$ X4 I% Ttar -tvf test.tar #可查看test包中有哪些文件$ o5 ^" t. o1 w6 k$ D4 F
打包后删除源文件
; e7 ]8 k- d/ |. `) `& @
& g: ?3 U! B$ P# a有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:& r" j9 h, x7 [/ d
tar -zcvf test.tar.gz test.log --remove-files
& w; O& c' O6 v. g3 @" A$ I, z打包除指定目录或文件以外的文件. \" B) |4 c/ n5 h& e  l6 |% l

) ?% T0 l: d% Q对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
) @) z0 }6 u! Qtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件$ P' _, W' S/ m/ E5 l! f4 K
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。$ g0 P) J- y/ f: q7 z1 b8 T
向压缩包中更新文件% e+ R$ v9 |( f3 c1 {# W

/ t# `, o) y+ j1 M2 }0 @5 \4 @例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:% b+ |; Y& J* ?3 o; B, ^8 ?
tar -tf test.tar --add-file=test #只针对tar包8 u7 h  A# {* L' A' u1 z; y
向tar包中增加文件
( d; i4 O+ g+ v7 T
4 B* y2 ~2 c) q1 t7 \% F" `向tar包中增加文件可使用-r参数:
8 S* v! Z$ Q3 `$ y7 b: p+ atar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
, m; Y8 I2 K& ^, F3 H0 \' R! z删除压缩包中的文件# K. ^* N0 R" w6 q; ]* m" @# ~

# T0 R: o6 C; t$ p6 j. s. O3 K在不解压的情况下,可使用--delete选项删除包中的文件:
  u; G9 v$ {3 a; u0 gtar --delete -f test.tar  test1 #从test.tar中删除test1文件8 \, X% M- A, o5 p$ k2 [
解压+ B" V6 ^; z0 }$ z! z$ _
9 t: g% B# _: K0 x5 }7 g
解压tar.gz和tar包到当前目录
# z& ]; i' }+ O- S
5 A4 k5 T' V. x$ O# Xtar -xvf test.tar.gz
/ H- @2 |4 ]% k6 O0 z( g2 W2 b" otar -xvf test.tar ' x. P7 D, z! ?  \
解压到指定目录7 M3 F* Z& l- C$ }; S1 s' X
, K0 Q+ F0 s) s
tar -xvf test.tar.gz -C dir
, M1 n7 R( _* ?  d' ]! \# n. Y2 Gtar -xvf test.tar -C dir' f; M- @4 w+ V4 a* q- D
解压包中指定的文件' w) V) r9 {8 @  c3 `, F

, R6 R; f5 r' |3 m' X( r0 O: Y2 L+ f. p例如test.tar.gz包中文件情况如下:
; O3 g6 l! ?- v1.txt
8 x( |5 }4 @# @2 b* }* g+ ~$ e( V! b* jlog/+ s1 t6 ?- [& P9 i& Z6 O
log/1.log
8 w) E) g8 W) {log/2.log, ~  ^* w. y$ T! O+ o6 b! c9 N% b8 W
log/2.log2 e! d" {- Y8 @0 o7 B' t  l
log/4.log
  [/ l% q0 ?- g  h* d2 }log/5.log3 q0 G' P7 ]' r+ V" D* K/ d
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
. r' S4 f& S% n( ^tar -xvf test.tar.gz log/1.log3 N' t7 R  _& h  E% y1 i" W
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录4 f0 O4 e+ }& P5 H0 g2 H& o
解压时去掉目录结构
; d2 H4 d$ d7 ?# c, R  U2 E3 X/ R( g1 S* q( v, C, m
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):4 i8 @$ S2 \& }% s1 o: H
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录2 d! Y) k7 u& j* ~& C7 }
解压时不覆盖原文件
# M, v8 Q6 Q5 u' Y/ S  }7 Z" M% a
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
; F( E3 p' L# a7 w- otar -xvkf test.tar.gz
; W3 B  T  \% h* V6 Y6 g特别提醒  \" @4 v6 Z5 J$ ?

, X1 k7 p9 F+ Q0 b9 K前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
% v( K5 U7 U6 C0 Q5 j, n. B  w# Ozip/unzip
3 a4 K. j6 o+ J% J! G
* n6 |6 ~+ V9 G* G7 L1 M! Kzip和unzip命令主要用于处理zip包。9 K3 q) y2 u! Y3 \0 l
压缩
) O$ Z) C) N% U' X
# T! N+ s- G* ~7 J, O2 K0 K' U) p, @涉及参数说明:( i9 |4 G- Q! g. Q1 K1 Q
-d 从压缩文件内删除指定的文件。5 I4 d4 h: L5 D0 w$ b
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。2 D: c( E! a5 ?) B; U& e
-j 只保存文件名称及其内容,而不存放任何目录名称。& `; u% w8 C( B& L* ]9 X0 E5 s
-r 递归处理,将指定目录下的所有文件和子目录一并处理。# F7 ~! f$ w0 ^, Y+ W
-u 更换较新的文件到压缩文件内。& Z; {- O- n" ]6 v' b% Z# w
-v 显示指令执行过程或显示版本信息。$ o' M7 o' y! p% x1 f  E; e0 L
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
5 W. w4 W1 Y1 i- <压缩效率> 压缩效率是一个介于1-9的数值。; n  f7 @1 m  c; C4 U
压缩文件  W4 M# `$ S3 b. b" c

- ^! e' P9 p8 F6 d4 Jzip -r test.zip test/ #打包test目录下的文件* K( _$ C- y, D) G  Q
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录! ?" V% }" o, V" _! q" ]$ p( v
指定压缩率打包文件
8 x9 [8 Z: V2 }, X( f9 \, J7 a8 u: @2 V* T' x6 ~' h- ]
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长& ]0 |  W$ V2 I8 r4 q) j, x
打包符号链接文件" E7 l- I2 D8 m5 G7 P% g

/ {; d* c5 S2 ?- q- {前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
& ?/ i% v7 O& ozip  -ry test.zip test1 D9 \9 F: v6 V; H' _. a* `8 t
向压缩包中增加或更新文件
' }6 r; D+ g" }& U; Z5 z% V; {* }9 K* U* _
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:* }0 I- s& R; R2 O0 t
zip -u test.zip test2 #向test.zip 包中增加test2文件
% i/ M, t" b9 f压缩时加密
, U; ]& o8 C2 z5 [9 r/ |
: j# J" x" H4 E3 e压缩时如果需要对压缩包进行加密,可使用-P参数:
' s# J* @; z: G4 \! J; Qzip -r test.zip test1 test -P 66666 #使用密码66666加密
# P5 v1 a" ?- Y0 V. N删除压缩包的特定文件( D' [* K( A6 ?0 }0 w" N& Z

* V% Z& n* Z/ F2 g4 v, }zip -d test.zip test  #删除test.zip包中的test文件
/ h9 o  a* Q( \0 T+ [2 ?! A解压
  b7 Z* H4 F+ i2 g0 `& G" v+ U, n0 j, ~1 u# d$ x5 ~9 r
涉及参数说明:
8 p) O" X+ P# \# o3 A-l 显示压缩文件内所包含的文件
, C2 Q+ x5 E9 R9 r- h$ h-j 只保存文件名称及其内容,而不存放任何目录名称。% q) i6 G! ]: |, W: Z0 Z0 j; n
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
: y0 S$ j7 ?* J& f6 {1 h-v 显示指令执行过程或显示版本信息。9 a7 y3 q& R! B6 Y. M8 l
-d 指定解压目录,目录不存在会创建
3 b! y- c% f3 _. l  S8 {9 \4 t, d查看压缩包中的文件信息
$ k9 Q. l, v0 @( K3 Y9 b  M% D  }. f  ~2 z, H
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
0 S8 R0 R8 R, [9 O3 i7 W8 Zunzip -v test.zip #查看更多信息,例如crc校验信息等$ f8 p% H0 z8 C# W( i
解压压缩包+ Y/ R& e1 @* P7 h

2 l8 \- \( s5 L! c; A6 m( h% ?unzip -o test.zip -d dir #讲test.zip解压到dir目录, i) Z# G) u4 x5 Y& k  Q
解压包中指定的文件
5 j$ m! d9 i0 W* y1 }+ x3 p' o- d0 t$ S% ]8 ?
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:9 b0 B# z# x( ]& j) C
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
$ e7 R+ }+ @1 w! L+ K/ A) }- j$ I5 vunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
+ h4 o( ^8 v) l1 f; A" \8 o解压时去掉目录结构, Q2 V' f; v: _# j, ?& ^  K
7 z! E( h! ~4 a3 }* a
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:* w% t8 ^0 Z* ~& x
zip -oj test.zip -d ./temp  
3 e: X  J0 j# g2 u# k解压jar包
% L1 R! L0 X% ?
+ h: x3 \: B3 Njar包是java归档包,但同样可用unzip解压查看里面的文件:
3 b! Y7 s- V2 N1 V4 |unzip -o java.jar -d dir
( ^9 j4 @; {6 q) @gzip! k& M0 ~; [5 h4 ]! p8 L$ N/ S

9 `7 f3 H9 \* ^涉及参数说明:
$ z8 s; Q: {/ Q, ^7 Q$ L2 L-k 保留源文件/ u2 X# b! T! T
-d 解开压缩文件9 Q8 e+ m2 _0 M4 k4 ?) P
-r 递归处理,将指定目录下的所有文件及子目录一并处理6 k  \7 m; A) z$ H  Y  l$ p- N8 Z6 ~1 M
-v 显示指令执行过程
$ l. k/ k) l7 |5 W; x& ^tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:# e! o0 p6 \% T8 L7 }3 D; H
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
1 a& Q9 i: i7 ~& K4 lgzip -rkv ./* 递归压缩: e6 q2 f) D0 r5 f( a! ^1 C" T
解压也很简单:
; k& ], T* _8 R: I) H9 E- `gzip -dv test.gz
! d( ~4 |* L4 _, p! pbzip2& l# L" ^2 M8 t5 H

9 F+ E4 X& x; F6 jtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:8 @$ m( [, @3 Q7 e
bzip2 -zk test  #压缩test文件& W/ F6 C2 V# X+ e1 N
bzip2 -dk test.bz2  #解压
5 n3 M8 d" `; N% B# `# h/ Zrar/unrar  u: G' U' K9 r5 _

: x8 D" @) X$ ~: Q" z( prar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
( r5 u( a4 T! C7 T2 `2 Jrar a test.tar test  #将test文件压缩为test.tar( j8 F/ z( K1 n" \9 m  p
rar e test.rar       #解压test.tar$ j2 ~  x: L; S' R
unrar x test.rar     #解压test.tar' o1 V! o0 l% U: z) {& C( Q# e
压缩率比较
; t& k1 ^% i/ d0 ^- i. g. V
; _' b( ?8 M6 ?# k, ]9 Q2 F压缩率一般来说:" t7 T6 P6 s3 ?2 \" ~7 e
tar.bz2>tar.gz>zip>tar
! C0 @3 ~/ I  g0 d! s压缩率越高,压缩以及解压的时间也就越长。
1 F9 {, `% I4 ]% h3 F1 D7 j$ F- D总结+ E6 t* R, C& n0 K
% D2 w6 D$ C# N3 }
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。7 m" Z- o5 [1 c" M) ^6 k2 v
有任何补充或建议,欢迎留言^_^。1 @; W) x; K1 I" K8 p; \
- o! ~" V9 m; B+ X; U7 U1 x! A
7 W0 F% h) _: ]' u! j7 `

0 L7 @9 `; _0 a5 E4 {6 |6 N1 [
% f% \  E4 a7 ]6 Q

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 07:04 , Processed in 0.083970 second(s), 35 queries , Redis On.

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