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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

) o7 c' F3 B% `6 z2 Z
6 ]  Y) Q+ Y8 S# c# D+ `
. Q- U# {% r$ W* Z' u
前言
# W' p! o$ ?6 B/ E! T. g, C6 m: T& J
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
! Z+ @* j+ }. _) h' X3 I0 I$ btar# o; F1 ^6 ]2 t
6 w, c! D' U5 Z( m
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。+ R! a& S* r6 W* q9 G8 ^
涉及参数说明:

+ s# c+ V' V  Q$ X% F5 p+ F  @-c 建立新的压缩文件
1 G- `) u2 f" j+ K2 @# p3 e4 [-r 添加文件到已经压缩的文件- H) O! Y% T9 {7 k3 P0 p) w4 k7 F
-u 添加改变了和现有的文件到已经存在的压缩文件( w3 Q' H/ l' X! d, Z8 ], e2 S! Y. m- Q
-x 从压缩的文件中提取文件; l/ C( H1 J, n7 m$ h, \3 I7 A& w% ~
-t 显示压缩文件的内容5 Y! q0 _7 c' |' T! P" o" O$ B
-z 支持gzip解压文件+ {" `$ B5 w9 E% T9 h4 J
-j 支持bzip2解压文件
' {) o- s9 C+ n+ _3 [5 M-v 显示操作过程
4 z& b$ L) J: E- ~1 R1 Z# K-k 保留源有文件不覆盖' e$ G% ^% |2 g) ^+ H
-C 切换到指定目录/ E/ I0 G* L$ e. _$ A
-f 指定压缩文件, q0 Q3 M9 O; d# ?. H$ R) q
0 L6 o% a8 b* q6 O9 \! X( d: T( p
--delete            删除包中文件
3 c( v& Q9 v1 A6 q--strip-components  去除目录  C3 z6 a, G0 _1 D
--add-file          向包中添加文件1 [  q1 z6 G# I1 q! [' G
压缩
, I8 i2 [. a4 C9 T4 N7 W7 F3 `* V5 l8 @7 t' Y$ b- Q/ a
归档tar包,不压缩% Q* O' [( o( M; u
% A8 ?- @' q# a6 Q! G
tar -cvf test.tar test1.log test2.log #归档多个文件# A& n/ b; v% ?: X; d0 S, W
tar -cvf test.tar test/*  #归档test目录下所有文件% f  ~: }+ m3 E2 M4 s* i1 h+ [- v7 X
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 , r, x5 D( R& T, _; a7 u  u; t
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
& C: ]% ^0 x) y; C. w" \5 Q( I归档并压缩为tar.gz或tar.bz2
9 A, b  _! e' n% l4 O  W
& Z6 x3 V8 _1 H  J9 e6 }" G这种方式打包对文件进行了压缩:2 l. y. C! E  Q% ]2 d1 q/ B& p
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩* M# }, C& Z9 R" y
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
5 s$ @" D0 q& T5 n/ X( o0 z查看压缩包中的文件
. Z$ [) c% v5 P4 t4 G2 a  z0 }- m/ M! R9 @
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
9 r$ p, k' h# i  W8 G. }( Ptar -tvf test.tar #可查看test包中有哪些文件
. N% \  }6 q! r3 P7 j8 j$ j打包后删除源文件4 f- u/ u9 m5 X( v3 q% ^. y

7 ]' S! p1 a' @; h/ a; T1 {有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:5 l0 `4 ]  M3 j$ [% {! u' V! V8 W
tar -zcvf test.tar.gz test.log --remove-files
- s% \( J, E# h4 W, N打包除指定目录或文件以外的文件
. y- @; J5 I* E& a& b
' c3 z: y4 }0 B- P1 a3 ~9 ?对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
5 ]: \1 U: e3 M7 Rtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件# T$ r: B, U% l- B# z. V
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。& `( W) ^' g, v* r9 w: P$ o
向压缩包中更新文件
5 w( s/ ]7 t) u" j1 Z/ X" r# g1 g; z5 B- B2 }
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:- b$ T- D# \. [5 K
tar -tf test.tar --add-file=test #只针对tar包
& f  R  g) h1 c/ t向tar包中增加文件
& F% f, ?: u5 M
0 _' I3 J! l2 `! b- c5 u向tar包中增加文件可使用-r参数:
8 V, ~, \# m+ ~  v! g9 [tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar) g8 b! [! K& V5 ?/ B: q
删除压缩包中的文件3 E/ V/ K6 p8 R5 W0 `8 |* |
! `% V; c) `6 P" H
在不解压的情况下,可使用--delete选项删除包中的文件:
3 x4 `. `# j: `0 t6 W( s* Ttar --delete -f test.tar  test1 #从test.tar中删除test1文件
. ^/ ?# i  w& B. Y8 P解压: e0 O7 v9 v2 d6 }* s3 i. e

& b2 B8 [6 v" M1 k解压tar.gz和tar包到当前目录$ U/ G: E# K2 Q, L0 T

  w8 t3 j" ?) l& e2 q% X1 Ctar -xvf test.tar.gz0 a) j9 ?9 C' f7 Q, Q
tar -xvf test.tar 4 T# U- `' J$ s' A$ t( O2 V  w
解压到指定目录
5 X6 o1 B. ~  I# {
, L1 I) x( S9 ltar -xvf test.tar.gz -C dir
. z* S* p4 G) }2 G' L8 f1 qtar -xvf test.tar -C dir
  V/ D( R* r$ G- [* i4 P解压包中指定的文件
9 J$ ?* q) l4 M' W7 Z
. }' _3 K) L# X$ V. g) R) x3 p例如test.tar.gz包中文件情况如下:/ `& ?( D1 h$ E# j9 U/ n
1.txt
+ k# S6 O( s2 P5 q+ {: ]/ Jlog/
7 O: O* i2 @1 tlog/1.log
& H+ ^  k  `- M3 s( B1 olog/2.log: Z3 n8 E, ]6 |  ~; M# P
log/2.log
' H9 L4 n+ q1 o+ L5 a9 plog/4.log
  b/ {0 i$ o0 C9 ]9 m9 m) Clog/5.log3 Y' W# @8 a$ `. |3 {7 _$ J
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
3 i: \, u9 }5 X2 s. x# M- D8 Vtar -xvf test.tar.gz log/1.log
9 o, e. N: [. a7 N' U' xtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
6 W! @! `( r* W5 q3 U解压时去掉目录结构! M0 A4 M$ j6 @$ K7 K+ o8 c
" E' ?4 ]# }  S% g
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):: L' j; \" M6 Q
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录3 m* l( c- E" @) f: B
解压时不覆盖原文件9 @1 |" q3 l% w# B3 P

$ u( X2 _$ F/ z5 T. }0 V- q当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
! J. W# J. @) Q  X; ~" T( l/ T- Otar -xvkf test.tar.gz5 @( t- f) g# I6 Q; m  W
特别提醒7 |$ [8 t% B# {% A6 Z! ~

4 |: Q6 U2 Q7 [" z# ]前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。3 [2 P. I5 X4 o, I, `$ |3 x1 e& S
zip/unzip' p! j4 {0 k' S; V& O. K. s9 R
7 f4 c  k4 g" f' K; [* S% D
zip和unzip命令主要用于处理zip包。
: V/ e4 e- [2 ?0 n$ ?2 b& y/ j# N压缩
/ o! F& G, W4 M" C, f6 P( m- D+ J
7 N5 c6 a# [7 F3 Z/ n9 Z: E( ~' w; L) C涉及参数说明:3 f1 N+ `8 j; C- n( M
-d 从压缩文件内删除指定的文件。
7 f( }: w/ Y* e0 e: q-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
9 m/ ?$ x! T4 E& O-j 只保存文件名称及其内容,而不存放任何目录名称。
3 M. k6 V- r, m, f-r 递归处理,将指定目录下的所有文件和子目录一并处理。
( _4 s& q, V3 s  R) x! V# N6 Z-u 更换较新的文件到压缩文件内。
  \# U; L! Y3 w# t8 T-v 显示指令执行过程或显示版本信息。% V$ C" C& O7 w) C1 }  {' H
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
3 h' V; Z+ v5 E7 |- <压缩效率> 压缩效率是一个介于1-9的数值。
9 q: F% h9 j2 ~" e% B8 n压缩文件  n& F& o; W% R4 B" N6 o. y4 n

# m* N8 ~$ k# w% L9 e$ dzip -r test.zip test/ #打包test目录下的文件9 P3 O5 v5 T4 Z2 g, [1 _( L  c
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录3 S. C+ b) h0 A- R
指定压缩率打包文件7 O# Y( S4 u! t
6 w1 n: T' T7 R2 D$ E/ C
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
8 C: E( i' j. X" F/ }  S打包符号链接文件
- ]& [! }4 _# r( V  P6 b  Q. x4 d: ?. E& @9 v/ }( O7 ~
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:; R" ?3 h; m/ `' n6 p
zip  -ry test.zip test
5 w; c% t' W' k1 @( k向压缩包中增加或更新文件
* N& s$ i; n2 U( I" |. @& q. \; W$ P% `" N3 L5 q
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:" w1 z& [1 ~5 e% E. ~
zip -u test.zip test2 #向test.zip 包中增加test2文件( P' @- I( z* T
压缩时加密/ c" h9 D( i5 _$ K

7 _/ ^9 X( V+ L# l5 t压缩时如果需要对压缩包进行加密,可使用-P参数:0 Q" ?$ S0 W" P; @+ x# v" F0 \
zip -r test.zip test1 test -P 66666 #使用密码66666加密5 P$ k) Y% d* u7 b- C4 [
删除压缩包的特定文件
6 s' f. L6 O) ]) L9 n  E: o" h2 d& a+ r4 N7 `& r5 ~- V1 H
zip -d test.zip test  #删除test.zip包中的test文件
/ |: U8 Q, m: _解压
; u/ U" {4 P7 M5 c6 y. O5 }0 d2 J, F$ ~% C! C
涉及参数说明:; ~4 _- m( `2 G4 R
-l 显示压缩文件内所包含的文件
3 B9 c% Z9 r# N" Z" h# ^* @3 t-j 只保存文件名称及其内容,而不存放任何目录名称。
. H7 h9 Z" s9 ]4 z-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该7 @( b- Z7 t1 ^+ @% n! n
-v 显示指令执行过程或显示版本信息。5 E  e1 x: |# p. W, X# `: M0 y
-d 指定解压目录,目录不存在会创建
, F' E& m# {: L( v0 |查看压缩包中的文件信息( n1 k8 d: b) K9 P  k$ q

$ M) O" Q& w) G/ M! K% aunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
1 L# V$ J9 j: P6 X' Hunzip -v test.zip #查看更多信息,例如crc校验信息等1 \7 l" z. N. M
解压压缩包
+ t: J4 b8 b# e) W7 o+ Z8 b0 n! V8 C2 C4 C  H' A; H
unzip -o test.zip -d dir #讲test.zip解压到dir目录9 o0 v0 u7 k/ y! w3 K- H) q/ q% o
解压包中指定的文件
/ Z: c# |0 t' d
) m4 S/ V( X) R: t8 x1 Y4 t. M如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
9 i) v  {* d( E; y$ d7 X. Cunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
% A. S& k2 d6 s6 Nunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
6 ?* z' j$ [% _# V, a解压时去掉目录结构
9 a8 B+ @; H( _/ @  H2 r+ L& v/ {; A3 ~
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
" @# ?' t" @% s, A& u* Yzip -oj test.zip -d ./temp  
( ^: s3 o/ s6 |  }' e( H7 u7 p" n解压jar包" `* |) o* p7 `  y! ?( l

/ H% V5 c) C# e3 X5 W: g3 ]: B9 ejar包是java归档包,但同样可用unzip解压查看里面的文件:  k7 Z: Z' L( i  r: m* U1 C6 X% `
unzip -o java.jar -d dir
  T/ J  }2 w$ ggzip4 P( Z' p9 L/ {( C6 ^! r* K& F

2 c" Q& \- C$ M. y涉及参数说明:) M+ B2 `* l; a2 J
-k 保留源文件6 t; p/ A+ |' R- C
-d 解开压缩文件# |- h. _5 x$ z( [8 B
-r 递归处理,将指定目录下的所有文件及子目录一并处理
4 k" }; W9 k  ^+ w: ]2 ^3 ?* {-v 显示指令执行过程" \" o2 O) s4 S4 C; ^8 P6 j. q! Y
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:* f* {. U6 |5 D6 i0 \
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包) [$ g9 M: G" F2 [! ~1 ]! n3 Z
gzip -rkv ./* 递归压缩
% e/ k! p: [, [* P0 w解压也很简单:7 a1 p0 |8 g  c5 ^3 m1 x- X
gzip -dv test.gz / o' g5 F* ^5 {" V! N
bzip27 P) y  J8 _6 ?  U; E* s

% b5 Q; l  t) s2 `5 }tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:  Y/ `& }2 j# C7 u
bzip2 -zk test  #压缩test文件7 X+ R3 D- v' ]& n) W) Q: M" R
bzip2 -dk test.bz2  #解压1 F7 L$ S) n% |6 i6 F1 {6 R: B
rar/unrar
) Y; V7 d! Q$ N. C3 h! h( k0 H- E- D! ^' Q7 P( m) d, z
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
* {! k, {* v4 m, T+ erar a test.tar test  #将test文件压缩为test.tar
  V) u; |& g6 [# Xrar e test.rar       #解压test.tar) G1 n) u( v4 u7 z
unrar x test.rar     #解压test.tar' W, n* H2 Z2 p2 j5 I6 C
压缩率比较
  E$ \0 `! k3 e: t* F& q5 E, D
压缩率一般来说:& @8 H8 ^2 g" ~  r6 g
tar.bz2>tar.gz>zip>tar7 O) u" e) o( P; m9 G3 N) A
压缩率越高,压缩以及解压的时间也就越长。5 j( Z! e! b4 U: o0 g" G
总结/ c: m5 m# _( Y. z2 O" q
3 H2 x4 f7 k, N# H* D
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
4 z4 m; ^5 I5 D6 U, Z有任何补充或建议,欢迎留言^_^。! U9 K3 E, ~1 E
4 G- ^2 d) M4 A% B8 S

# {% J4 z# s+ W. k- o6 P; G' c9 e# \4 n7 ?$ U! [- n
$ ~+ w: V. L% ?

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-15 11:13 , Processed in 0.063775 second(s), 32 queries , Redis On.

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