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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
1 Z+ {4 _, D$ Y
9 |) K/ x2 F# ]/ ?) r, U# l4 [
+ ]4 P8 H3 Z/ h* W& @% p2 ?
前言
" ]* T# H+ {9 J0 l- C% `. f
  j  I' |3 J+ E5 ^- w8 a( g& M' BLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。4 A( _0 J; j6 m3 K
tar2 X: C4 X: K" y7 m% H) v
+ Z- q' T# w0 P; B- |
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
0 h9 h4 P8 |% Z1 f* o( |5 h涉及参数说明:
0 [* `* h" T/ O1 P. o( T: F
-c 建立新的压缩文件
& }' t! Z3 ^1 ^+ Z- v-r 添加文件到已经压缩的文件2 j5 [/ b% z- D
-u 添加改变了和现有的文件到已经存在的压缩文件
6 j1 Z% N* t6 Q+ L& g7 U3 ?* Y* \-x 从压缩的文件中提取文件$ \2 t* d6 e# O. y% N0 O  l
-t 显示压缩文件的内容- R5 w5 f# c& i
-z 支持gzip解压文件
; i! e5 C3 g/ _& m2 W$ L% z-j 支持bzip2解压文件# b( r% O2 B6 M# E1 g
-v 显示操作过程% S/ R' B* M8 @% x. O3 C
-k 保留源有文件不覆盖: p# Z8 K' [' N9 e% T' X
-C 切换到指定目录
9 A% ]4 d6 ^  N7 H" a8 d-f 指定压缩文件+ q4 S* \- f. E8 X$ l' J
& \# p& v  {, q! }/ D
--delete            删除包中文件
' i3 c) X7 u9 n; P" Y--strip-components  去除目录, M5 J- Z$ U# z9 [
--add-file          向包中添加文件
9 `! y: N/ y" Q. @$ E压缩
4 N8 T5 H7 T& q$ n
5 L/ z- @: D/ F3 U  Q" U( G. x0 D( A归档tar包,不压缩5 Q# F% [$ I, R: C1 x! V
: e) d& q3 {! R7 w9 i3 o6 G! F$ V
tar -cvf test.tar test1.log test2.log #归档多个文件# s0 ]0 \- T2 K
tar -cvf test.tar test/*  #归档test目录下所有文件3 M+ O. I# F+ A, c# y6 {% n
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 3 h8 Q) z+ U, `$ Q" h7 e+ I- T5 w
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
& n! g7 h2 `2 y9 b; q归档并压缩为tar.gz或tar.bz2
7 B1 [4 B0 \+ \" ^, ^! g$ W8 a' z! r1 e, Q5 D. X- Q
这种方式打包对文件进行了压缩:
2 P+ x3 U- @$ [- Wtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩% }, ?; @/ z. f7 i
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩6 }; i4 n! J8 j7 q$ B8 C4 V
查看压缩包中的文件2 Q" Q6 ]. m9 J" {. m  X) r$ w3 k7 z
) V9 T  S8 t0 q- B
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:! h3 a/ H. q  `0 Y3 ?3 S: X0 v
tar -tvf test.tar #可查看test包中有哪些文件& R8 p! g; X  u' ?6 ~4 L
打包后删除源文件/ U/ y2 M* ]8 L, k$ V

5 f) \: o; u$ l2 B8 d/ K+ ^" V有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:& b4 y0 a# u) Q8 ~
tar -zcvf test.tar.gz test.log --remove-files $ Z/ G5 R. H) W/ {- E  ~6 ?$ F/ r7 P0 d
打包除指定目录或文件以外的文件- G5 H+ c4 Q" ~, p* d  Q
" }/ P# L: `& H# s3 T  y+ T
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:7 Y+ K6 ^& ^) e" ]/ t( G' W0 i4 d4 Z- J
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
$ g; N, w* G6 _这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。9 a. |8 ~, {. M
向压缩包中更新文件
0 i  \4 ^3 i- p( s  i0 ~! R# j0 q4 Z. s4 u( W
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:( V( y6 b2 c/ e& S
tar -tf test.tar --add-file=test #只针对tar包
% d) M; I, r3 a, ]  J向tar包中增加文件' a2 ^  Y9 @5 F; n
' b/ q, X( }# O3 x
向tar包中增加文件可使用-r参数:$ p+ c8 t7 z' n3 b1 a5 q  A4 X
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar$ d& y' M, j3 u; l' d
删除压缩包中的文件7 {4 w( d: L3 q' K; @! M9 L- @; n

: V7 w9 X1 s+ x4 C! T$ F在不解压的情况下,可使用--delete选项删除包中的文件:
6 d; @- G3 u6 {tar --delete -f test.tar  test1 #从test.tar中删除test1文件
; `( U  T5 z/ U1 s3 X9 U- Q0 J3 h; g解压
7 M1 \# y( b3 g* V' @
/ w4 X  `0 ~4 o0 G7 }解压tar.gz和tar包到当前目录
* x' u- n# F& T* S2 V2 Q+ W8 ~4 p8 v; ~1 b& g8 Y) H  D; {& I
tar -xvf test.tar.gz
, c3 `! T; V0 ttar -xvf test.tar
6 A! a$ ^) ]% K; L8 y0 e# u2 A/ ^解压到指定目录6 X, C6 K) ^8 r: m) {: G

" Q( Z+ W4 v- X# u2 ptar -xvf test.tar.gz -C dir3 k' k4 N. }( [
tar -xvf test.tar -C dir1 q' F6 n, E+ i! t) {! ^' L" `
解压包中指定的文件
3 R" _* [# E8 C, F
0 i+ y) A& R& T  p! s- O; w例如test.tar.gz包中文件情况如下:: ?& \  A0 r# ]( L) d7 f( r
1.txt% v! p2 p+ n$ M& v2 w
log/
) m3 k0 j8 r* T6 ^7 X3 ilog/1.log
0 P; v9 C( G7 Z' @log/2.log
! a1 q2 y2 }4 E9 k: Q6 N* zlog/2.log
: g" V; a9 H- T# p: x' ylog/4.log* X! w; H4 g' [1 ~/ I9 E; K
log/5.log. F( P/ ?5 Y. C. s5 p
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
) F' L3 i# p7 G# Ttar -xvf test.tar.gz log/1.log( p# Q  q" @# U8 ^3 X$ J! ?; u8 P
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录* d, a- d. l) a9 q; b) K
解压时去掉目录结构
7 m8 l& n+ R% w8 F: `
7 O7 I% A9 a, O3 B, I  ^0 ]- o压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
3 c: S: j5 i( |8 {2 Atar -xvf test.tar.gz --strip-components=1 #去掉一层目录- q, D% U. Y- ^5 `5 H2 l: G( n8 S
解压时不覆盖原文件
9 B! d5 O7 C5 k/ {' [1 }- T1 `8 M/ q
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):! x" h5 h: M0 l* ?% I: b
tar -xvkf test.tar.gz
1 n6 S8 D) B9 P* M" U# V. u+ H特别提醒
2 s5 k! }" J9 P+ ^
' Q$ I+ X9 Q# D6 z  Q( z前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
: [; a' y+ a4 f  g' kzip/unzip* {# L- K, \" a) T/ W8 W* d! q
! H, ]# i8 P# [$ T/ g" q7 _
zip和unzip命令主要用于处理zip包。
  g! V* e8 E% Y7 N1 C7 g压缩
& N4 ^2 m8 M1 X5 y& t8 y+ d
  K! h" A% e0 W5 l0 z涉及参数说明:( a' m. `& w" X+ |
-d 从压缩文件内删除指定的文件。
9 U0 \+ w8 w. w-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
$ @4 o) v) F( r- U% ]# G: h7 R. [-j 只保存文件名称及其内容,而不存放任何目录名称。. P3 D5 Q+ W4 L0 k6 h
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
5 \. k9 Q& i! s, V-u 更换较新的文件到压缩文件内。# \8 d$ ?9 Q0 M) G) D  F# [
-v 显示指令执行过程或显示版本信息。) v9 B" k0 Z8 n# m& F' M" i
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。, w8 r+ s% G( s5 m6 I3 K
- <压缩效率> 压缩效率是一个介于1-9的数值。. e3 r$ T" m& V& m% n+ U& z
压缩文件9 G! ~, _7 |! q6 H7 b

: A- w; x5 l- M- E( Bzip -r test.zip test/ #打包test目录下的文件
# F/ [0 d, J9 I! u6 A+ z+ v( s* czip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录0 \$ e: w1 L' H
指定压缩率打包文件7 P5 a; T; z+ Z: ?6 v' ]

: I$ `8 u9 b7 E  G5 j5 zzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
7 T: Z( `, l# B" I. w% g4 j打包符号链接文件
2 ?; l9 L3 ?* c0 {
5 Q; T; r1 S# ]5 I' M前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:0 e- \9 W# v) L' G2 t" Z
zip  -ry test.zip test! ~9 \1 i% ~/ ?0 F/ f$ q' f
向压缩包中增加或更新文件
" Z: V" i2 }+ ]; I% ^
2 X. R" B8 O* e7 x- h  g有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
5 z9 b* H) \0 p- H# R5 Q) H0 |9 ^zip -u test.zip test2 #向test.zip 包中增加test2文件
0 i4 V& Q3 b7 Q# a1 ]/ j压缩时加密9 b& H! H' f% O

5 a2 x$ n1 J1 Z2 _9 i% G压缩时如果需要对压缩包进行加密,可使用-P参数:3 J& L: i* [. L
zip -r test.zip test1 test -P 66666 #使用密码66666加密4 I- K( F9 E, i$ u( J( S( S4 N
删除压缩包的特定文件
3 `+ C5 d) Q" ?; E/ X  |& \% T# q* j( ~  i% \/ @* D6 p
zip -d test.zip test  #删除test.zip包中的test文件& u6 M& {, r0 h- O4 B5 @% h
解压
. ]8 Z7 i. g) u" z) H5 ~$ l
" k3 Z; u. x' n8 ^, x4 `+ v涉及参数说明:
1 Y; Q$ z1 k0 v) H  }-l 显示压缩文件内所包含的文件
( E5 _6 g/ n6 S# e% o- m+ O  @' S-j 只保存文件名称及其内容,而不存放任何目录名称。
% J2 A$ \4 i9 V' D# }0 U( I+ P-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该+ E! w8 |# M7 L& v( `% ]
-v 显示指令执行过程或显示版本信息。  v0 f/ b" O. x
-d 指定解压目录,目录不存在会创建
) H! ?1 B5 G% }4 }- m. Y查看压缩包中的文件信息7 }% A& L- P. V! K* ]9 J

  |9 Q. j( }- i5 ]unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
+ U/ N6 J- ?: s5 L9 Dunzip -v test.zip #查看更多信息,例如crc校验信息等' @$ G- B' g8 Z9 z* Y4 N" g* T& z
解压压缩包
9 s5 W, y  ]; j  `$ V, O
, `- c- c+ i2 {  f% _  M' eunzip -o test.zip -d dir #讲test.zip解压到dir目录" W  ~9 v9 v% Z( G
解压包中指定的文件4 A1 J) U0 }: s
( u1 V7 Z0 N" B
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:( t- m2 {) X; z6 N- G0 p
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
7 N& i  L( `' {/ i% n/ C: ]unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
4 u& @3 y  O2 G. I' H解压时去掉目录结构5 a0 Y% h% y3 s' W6 H# b

2 c3 f5 m& X) f/ d3 \压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:0 Z$ W# j4 e: v0 P  x5 T
zip -oj test.zip -d ./temp  " A, `0 @+ q7 l4 N8 d) O
解压jar包2 I, w- h& R0 R4 q; H

. ^% Y  K" J( kjar包是java归档包,但同样可用unzip解压查看里面的文件:
% O1 W: @1 a) e7 f% u' e6 Uunzip -o java.jar -d dir* k7 Z9 v3 W2 S" w0 l, g
gzip4 t2 g; k3 ?* v6 F; J

! S4 y4 ]8 p9 ?! R; z涉及参数说明:! N+ c$ M8 l! Q. c3 q, M
-k 保留源文件1 L8 Q. Y4 z  ]6 i: M% `2 {% g# p7 x3 f
-d 解开压缩文件! j" G/ Y2 S, }) E
-r 递归处理,将指定目录下的所有文件及子目录一并处理  {' C" e, M: j/ k; Z0 S
-v 显示指令执行过程
. w  B) R9 N' k& ~, atar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:9 [* y5 ]; s% d
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
  C; Z; u/ M: D2 [) x! m) cgzip -rkv ./* 递归压缩
: ]9 I5 S+ C9 Y6 W解压也很简单:9 F$ |+ U9 ?0 o& Z/ I
gzip -dv test.gz
/ p! G9 y* Y1 X) }2 ybzip29 x  l+ N# y; A3 C
' U% j( V: o. `6 g( T: x% R
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:) z' V) j2 o3 r1 d2 W$ d7 Q
bzip2 -zk test  #压缩test文件
" B7 w& M3 d$ u9 pbzip2 -dk test.bz2  #解压) m- _9 Q* X6 X9 L
rar/unrar
8 B  G! T7 S7 U8 g
$ N0 e# {! [( |/ L" M" X7 m! {, erar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:5 H3 j; Y. O5 j; j+ i( z' c% g5 c; `
rar a test.tar test  #将test文件压缩为test.tar
$ C/ E& e, l' G. X" M1 k" t; prar e test.rar       #解压test.tar' K* L3 W7 a1 ^2 z3 W  a
unrar x test.rar     #解压test.tar
$ c9 F3 b  a2 a: J  C压缩率比较7 [2 `& d2 b" `4 R6 Y
' q( z/ ]) }7 P% r7 e: }) `
压缩率一般来说:4 `* M5 I, S2 ~) v
tar.bz2>tar.gz>zip>tar
2 C7 {. L# {( I" r7 ^  M3 r  s压缩率越高,压缩以及解压的时间也就越长。
2 p% ?+ c) h/ m总结$ v6 K7 O# u5 ?3 D  A

: y& a; _- X0 [* A- T% O对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
1 s& l; @- @7 N& @: o, j有任何补充或建议,欢迎留言^_^。! \- L0 P2 N1 _' n

$ E* j1 \7 Z8 B: ~: K" d. a
( X( B# ~/ d! P  W/ ^8 i" y  W( {  p& ~) g7 G
- b: T8 _/ R% n1 R8 B

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-2 19:00 , Processed in 0.067313 second(s), 33 queries , Redis On.

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