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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

) X1 Y4 L# D+ x0 O$ c, q& V$ ~% Z1 H8 N6 m: j9 A
! t! P& p+ s5 D" C/ v4 q# h. f
前言
8 h+ e# W5 ?7 T
! c6 C4 d5 R! v3 K" yLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。; n3 _$ v% b# r+ u( l" t
tar3 [1 q: J) i" N) [* [

; \8 N9 I* {7 y2 h; `* y/ Ntar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。! [0 B# R0 }* i* ]  W8 N' u$ M
涉及参数说明:

! d9 f% W- w" a- `4 S, A-c 建立新的压缩文件* i" P# u& L- L9 {# W0 }9 s3 p
-r 添加文件到已经压缩的文件
- m% |0 O9 ?3 b; r4 r) b-u 添加改变了和现有的文件到已经存在的压缩文件+ Q% l5 A: B# O, n% c
-x 从压缩的文件中提取文件# }8 z4 h. D4 F0 K$ ^
-t 显示压缩文件的内容5 l: Q+ L2 \' X9 D8 z
-z 支持gzip解压文件
' Z  [+ E/ ?5 o- f  R1 B-j 支持bzip2解压文件
; H. |' d# v: R, F: M  Y2 ?-v 显示操作过程
/ Z" S3 a+ ]9 s! C7 w5 x/ l3 V-k 保留源有文件不覆盖
3 z6 f! O. @8 r  G$ I$ A+ n* _-C 切换到指定目录# E: k8 U# i( X+ V
-f 指定压缩文件
0 C, V& d4 \* d! n' O. v4 g. ~0 ^' |) Z
--delete            删除包中文件% e" `6 [1 V3 p( s, M
--strip-components  去除目录" t" Z5 t. d6 c+ ?- L  L; s* }4 s
--add-file          向包中添加文件
" E' m) c4 t1 \7 m压缩
8 u# F7 O& t! E' v6 k6 x0 M0 B; ^* k4 I* G& H, S2 [+ |# e
归档tar包,不压缩
  M( N' d1 g) p" W6 V: b& d
$ c7 V! a9 o' Q# W8 d5 J; _0 \tar -cvf test.tar test1.log test2.log #归档多个文件
7 i5 j) A. {! O8 rtar -cvf test.tar test/*  #归档test目录下所有文件
0 C8 [* K, ?& b1 x+ Ttar -cvf test.tar *.log  #归档所有以.log结尾的文件
7 Q5 {+ T" |/ D# r由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。: L' h  w. h) U0 T0 a) y; N# E  S
归档并压缩为tar.gz或tar.bz2+ z& k4 Z4 H& `9 B4 z+ l
, h: E* z' |; J5 m
这种方式打包对文件进行了压缩:
6 f+ B: v+ m: O: Z7 Z$ star -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩$ K% t! o! k/ _3 [# n
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
/ T8 |; y: O( O9 X& O查看压缩包中的文件! D8 |  |2 ~7 s6 P( `1 A4 u! J

; `' N$ K# t- V- J3 A. g$ U如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
* |4 `7 E* U4 T" {tar -tvf test.tar #可查看test包中有哪些文件
6 ?* j5 s5 ^: J2 T( D; F( A' ?打包后删除源文件
0 ]9 U4 M8 i) |9 T/ `
7 n  \! s% h( K" ]/ d0 Y有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
' u0 T# _& ^7 a+ rtar -zcvf test.tar.gz test.log --remove-files % w, U  ~2 O9 b/ t6 a
打包除指定目录或文件以外的文件
: I- V8 e% O! N" g6 Z3 N8 p3 R1 q" R2 f6 s/ z5 w, a7 v, ]
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:) P! r6 @$ g6 a2 |5 L- i! M
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件7 P% J2 c: o1 H% q, \
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。9 M  K9 A7 h7 n. Q( N9 H7 @
向压缩包中更新文件
) }( B; o  O# _. G- Z3 F4 Y: h6 h# C
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:5 m* P* \4 C6 e9 }/ f* a' e
tar -tf test.tar --add-file=test #只针对tar包& W! }3 U( o, w1 i5 |) G
向tar包中增加文件
- r3 X/ k: ?* w9 q
& P( C  C7 F) J  w* X6 Q- Y向tar包中增加文件可使用-r参数:
( F2 M( ~8 e. O' E! Ntar -rf test.tar testfile #在test.tar包中增加文件,只针对tar+ v0 V1 `7 ]5 x
删除压缩包中的文件
& O0 [" _/ z5 a- _; x
* q" V+ i* @' K  j: a在不解压的情况下,可使用--delete选项删除包中的文件:9 N3 P; n& f! O9 m/ x+ H2 I* S
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
# i! q/ T! p% V解压
" C, ~. D7 R& U( A
3 R4 K( j' _- _7 ]$ I9 F2 f解压tar.gz和tar包到当前目录/ [) L1 ~4 k9 R8 i- D8 Z
+ o7 R0 P6 o  o3 X5 `& k
tar -xvf test.tar.gz
0 b! d0 ~1 Z6 r$ Q- star -xvf test.tar
$ O' [2 A: Y8 w" D4 R解压到指定目录4 l' S/ E3 N2 _- o2 b1 Z$ |) e
( Y; R( l  `+ D6 H5 s5 E
tar -xvf test.tar.gz -C dir8 ^: Q* _! K8 Q4 N% w! k
tar -xvf test.tar -C dir  Z. J: [9 o. ]2 b8 f
解压包中指定的文件4 Z2 \; Z- l; q/ ?* e$ k
7 U1 G/ `" B3 e" w
例如test.tar.gz包中文件情况如下:
- W' M4 p9 f& R  ]+ b; y! e; w1.txt
' s& v* {2 V% h/ l# [! K* Rlog/* n6 i0 O5 P4 \! U. b, q$ K; H2 h% r
log/1.log* b" c/ u$ [& `) {, J' N5 \
log/2.log' |8 N7 e2 u3 x2 k
log/2.log3 ^9 F& s- @( ^/ l* c
log/4.log
, r$ O( `' q+ E* ^/ W" q  ilog/5.log
8 ]- M: |* I9 C( d( N+ C$ z如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
8 Q' r% _' r: M9 }5 a- q$ J7 q8 Rtar -xvf test.tar.gz log/1.log
8 |1 l: G# [( H6 G6 Mtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录7 e# o& g" ~3 c* q7 s4 l$ X' ~
解压时去掉目录结构& i# M& e) ]+ |
/ N9 O' l2 }5 T: ]
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):. I) Y' x' v9 v% z
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
$ S( ~/ d* Y7 m1 Y( l8 x; \解压时不覆盖原文件2 b! q) G5 {" |0 ~2 A4 b

" g" F. x# t* p( [$ f9 J7 H/ H当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
5 X1 D! Z9 h6 q) c3 ]8 l$ o# z: ftar -xvkf test.tar.gz
$ F: @6 T5 d; C0 J- h3 a特别提醒5 T% E6 K# J2 Y! G, a& s; L9 Z- d

, S4 t5 e- E6 @& B1 P* @& M前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
+ [6 u1 ~2 f8 S* ^2 J- \9 szip/unzip* T. V: `1 A4 I$ ?  c1 E
3 b- u+ f% {' }2 m" E
zip和unzip命令主要用于处理zip包。/ E) P1 b  |; f: R1 ~
压缩
# x9 H1 D# v9 b# m" |
+ _+ O  {  `. ^! o& H+ W涉及参数说明:8 n2 B! x# @! S% a3 Y7 v: F
-d 从压缩文件内删除指定的文件。
) n1 |; V" n  I8 _-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
& Z  Q: t7 U1 b2 ]; L-j 只保存文件名称及其内容,而不存放任何目录名称。' n) _* A2 n* z5 `
-r 递归处理,将指定目录下的所有文件和子目录一并处理。% U! Y% v& @  v5 _8 p; W4 R0 I
-u 更换较新的文件到压缩文件内。, r5 m; s& r- n* O; H: h
-v 显示指令执行过程或显示版本信息。7 o! {5 ]1 d8 [( L) G
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
, P/ y0 h% B: Y3 c2 P- <压缩效率> 压缩效率是一个介于1-9的数值。
6 n0 i) N0 z) N& H压缩文件' n8 u: u2 |5 N" g9 j

3 i" X$ g# _  e: J# k! W. Gzip -r test.zip test/ #打包test目录下的文件; F, h4 w6 f! p8 b5 K
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
, o# ?% z; ^' }% g8 i$ d, @, Q指定压缩率打包文件
5 ^- ]) z. k! t/ A1 J
6 h9 M/ u" q* jzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
: Q, v8 x. z2 i7 l1 ^$ G打包符号链接文件
2 q% l, \& o2 v7 M" m& t; a
( e' |6 s8 r, V; o! c+ S! m7 D, G3 n前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:  d9 A. e1 c  x1 T( ~
zip  -ry test.zip test5 n3 ~; m6 \, L6 i8 L$ S$ A0 U% }$ i9 @
向压缩包中增加或更新文件
* o% ]3 I: Q. t" A" w# E
! H5 R6 G( @# a' X' r" o有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
, F  R4 K4 |9 L: `zip -u test.zip test2 #向test.zip 包中增加test2文件7 _5 ?1 f) b' V' z5 e+ o: g
压缩时加密
8 l9 Q# U" ]8 C. I6 `- g+ }1 q. B: ?4 O
压缩时如果需要对压缩包进行加密,可使用-P参数:
2 l( x* J( d" e) Z  D' |zip -r test.zip test1 test -P 66666 #使用密码66666加密9 V0 c' X* m) j8 r) l# _) j
删除压缩包的特定文件) n1 z- B; R( }3 a* e

( h- f& u& O  Wzip -d test.zip test  #删除test.zip包中的test文件
, ^1 }% d5 x1 G解压6 t  Y( X# n9 q, q
. [; K. y& ]/ X- I% Q3 k
涉及参数说明:% ^4 S1 T, M, S1 a& u! p
-l 显示压缩文件内所包含的文件8 A1 m$ ^5 Y7 E) \4 m7 E1 A4 g: I
-j 只保存文件名称及其内容,而不存放任何目录名称。$ j$ X: h8 i- y
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
% q, s! \2 R) K& q( e5 G-v 显示指令执行过程或显示版本信息。/ j+ k0 [0 V* j2 L. M$ x. b
-d 指定解压目录,目录不存在会创建3 y" c/ i8 c! Q9 k9 n( r
查看压缩包中的文件信息
( T+ W: l$ k4 n- L- _# J0 ~( r2 e, P- f; u, Z& u
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
& D7 O0 |5 K" _" l' `" b, Junzip -v test.zip #查看更多信息,例如crc校验信息等
; T7 o! z2 _, V  ^) i/ N  A. n解压压缩包/ Y) t% C# b4 N3 n

+ \6 N) d" D# S9 wunzip -o test.zip -d dir #讲test.zip解压到dir目录8 ]% K" F( u7 @  g) ~+ Y
解压包中指定的文件
7 I0 |( t% H' n; _$ Y( o8 t( g
) J* V: {) P" X0 @& t* ^如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
* |4 @5 I6 y+ k( I, Z+ M6 d' Hunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
+ x; r1 G, d7 Y% u- E1 n# P2 @unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
& @0 W0 i  c1 k' E$ p# x( p解压时去掉目录结构
- @' N1 r7 j1 i( m$ c
9 z7 v# `0 u: @' s5 i压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:* b- P# w$ `$ P' p
zip -oj test.zip -d ./temp  ' f. o1 e4 Z6 v  n: A
解压jar包- ?) ^. T8 `! z, C
* ^# k# D" I( J, P2 b! g* f
jar包是java归档包,但同样可用unzip解压查看里面的文件:
+ q$ u5 s2 j- x: [unzip -o java.jar -d dir& R* R$ @' R, R, l" @+ Y- K
gzip
/ L( A9 k$ s: z* r- F/ X9 m3 b* y! C/ u
涉及参数说明:, U1 L8 `. U0 Q, L, V2 I- k9 O
-k 保留源文件% z! o" o& `. M5 }" W
-d 解开压缩文件$ t3 c0 c  w$ f# |7 l
-r 递归处理,将指定目录下的所有文件及子目录一并处理4 r! M' V. J7 _0 D
-v 显示指令执行过程1 c/ z4 p0 p, u4 C
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:4 k& b: t& N8 q' V
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
8 F( J" ^% p7 A* w- _9 ~gzip -rkv ./* 递归压缩
! z- z+ L8 n$ V3 x9 s解压也很简单:
, K% D$ t. t  S9 ~  sgzip -dv test.gz . _0 a. P' @  F9 G7 w" ?+ X! u
bzip2
. h. l  b1 n, `& H1 U) l( f8 a; r! d: v
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
7 b) O* [# R' N. c( Q# s. zbzip2 -zk test  #压缩test文件
5 O' i/ Q# e6 c. j# `1 Ibzip2 -dk test.bz2  #解压3 g# [! Y) C2 J3 m
rar/unrar& V0 V/ r! c7 L" `/ c6 ?* s& ^
" C( o2 N0 {, r" D
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
- K$ n! A7 l! _3 q- q6 M% A& }1 S5 }rar a test.tar test  #将test文件压缩为test.tar
& j$ q0 l* b6 A+ p  H9 M0 Xrar e test.rar       #解压test.tar* q0 q2 Q7 T7 H# z9 `
unrar x test.rar     #解压test.tar9 c9 i  l7 R9 f
压缩率比较' Y( a* f. J. Y0 Q
! V7 i# l0 R' m" p8 D8 \% J+ j
压缩率一般来说:) O! j! v! }, J2 v; S" ~
tar.bz2>tar.gz>zip>tar
8 ]3 f* a7 v. Z$ M# b压缩率越高,压缩以及解压的时间也就越长。: c8 r: b  V# Q$ v# e4 C( v' E
总结
" m, Y/ f% _+ [& F* Y
8 c  o0 K  p! }+ h+ Q7 o: E6 v2 l对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。) c4 g4 l2 `% I
有任何补充或建议,欢迎留言^_^。
2 }8 U$ v% d/ C% o) \  ]. x% M3 D% `& z7 t; d

: X+ d+ n* r6 y4 O2 l2 S
: o8 W  P; U. p/ Y, m$ s7 G5 O# Z
' S8 ?. [1 B2 ]4 K3 ~) f

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 12:28 , Processed in 0.078559 second(s), 32 queries , Redis On.

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