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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

+ o+ X6 S( w5 x9 B9 |8 W. [
8 `5 P8 ]1 }) M/ F& z7 M- m
+ L1 q. b+ Z6 \4 N5 h
前言% Y2 l6 V# o& I6 G' c
( r. t" \% |' M/ ?' S
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
) f+ c& W7 I( _9 l5 Xtar
5 h; j6 T7 z! u* S
. `! G) g4 X% F' B  J9 Ntar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。2 {: ?0 s* u. a4 j# n9 J6 I6 B
涉及参数说明:

9 J: C) k9 P2 ~" \-c 建立新的压缩文件( B9 k; J5 Q1 S: ^1 I
-r 添加文件到已经压缩的文件0 b% O# w6 V2 S) ^3 Y( g  u. B
-u 添加改变了和现有的文件到已经存在的压缩文件
% ^/ _  W! D$ s1 [. Z, `$ E* t  ?-x 从压缩的文件中提取文件4 h% e1 Z) x* f5 S8 s  A0 n
-t 显示压缩文件的内容8 O6 |+ F* e# e: k
-z 支持gzip解压文件, w" e0 v1 g3 C9 n  P
-j 支持bzip2解压文件/ d; [+ j. m3 y4 ?! w0 e
-v 显示操作过程; ^  T7 u( ~/ s: Y
-k 保留源有文件不覆盖" u: {/ W- }. D9 B6 S8 G' Y# P" P# A
-C 切换到指定目录2 a1 u) }5 c1 ?% I5 \- a
-f 指定压缩文件) Z' v4 T& t( z" P) d
& E6 q, }1 o9 R1 `
--delete            删除包中文件
: P$ C! B, K# |. ?+ d0 {/ T2 L--strip-components  去除目录  J) C' S! H# Y& a) f
--add-file          向包中添加文件
$ g! v! V! m+ n压缩
) l- n  N0 D! z# K) m
0 {# F* I9 E5 S8 j: a2 F: g归档tar包,不压缩
3 y4 m! D2 ?' n
* m; Y1 r" I5 }! g9 f' Jtar -cvf test.tar test1.log test2.log #归档多个文件
$ w, u% S; Z( N1 vtar -cvf test.tar test/*  #归档test目录下所有文件
1 O* k1 m1 G; _5 e' B, p' d  P# gtar -cvf test.tar *.log  #归档所有以.log结尾的文件
. C$ V9 a9 [& ?3 q5 f' g由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
- |: y4 r# K3 {. J归档并压缩为tar.gz或tar.bz2
4 z) I1 K7 W; t% v, O# W: y% S" f! k% F- L& A
这种方式打包对文件进行了压缩:
7 g: j8 b1 D" I; j! H5 @5 C/ xtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩* O: B1 U# x( r
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩& X1 D  \$ V8 x- f/ B  g
查看压缩包中的文件
* X% P9 L) G3 l# a3 U; Z
5 z0 z; c# D$ f! B$ s. J如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:* I  }3 x# C0 y
tar -tvf test.tar #可查看test包中有哪些文件) @# |3 _$ t2 z6 O. g
打包后删除源文件3 ~4 `* a) b- S, s

3 T/ h( u/ e. h8 U+ a' f有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:$ B% ^3 A! j/ K
tar -zcvf test.tar.gz test.log --remove-files 5 ?0 b) P( |3 Z  ^' W
打包除指定目录或文件以外的文件
/ Z% i: [- V, [8 U) A9 Y0 V5 u
( A8 j- G( v( P3 F对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
1 N5 A5 Z" q( [2 f- ]; Ltar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
  {% t' m- N- g2 R' ^- n# j3 }这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
' D# [9 ?: r; y- U; ~- [( s向压缩包中更新文件
: l4 V" [2 U& h# O- n
: {: Y4 W. }% U0 J) q例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
, i8 z4 \" q- U# ^+ R: F+ f, Y7 ytar -tf test.tar --add-file=test #只针对tar包* G/ C9 v7 m. _) S2 i( P# e
向tar包中增加文件" ]! t0 o, w, l, @' B

/ O! j8 X0 `* I/ m9 [6 b- Q向tar包中增加文件可使用-r参数:4 N4 l3 }( Z4 p- U( u* J
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar9 |! e1 Z6 u7 x
删除压缩包中的文件4 V+ y/ q) i# m2 D, r. r7 Q

  X% C4 p- b/ Q! Y: ^在不解压的情况下,可使用--delete选项删除包中的文件:% D, a1 w7 _& `/ i7 z
tar --delete -f test.tar  test1 #从test.tar中删除test1文件9 `  u' f! q) g" L) G
解压
& G2 O* [. f* J5 k# F/ y) e, Q6 G
6 ?+ }9 i3 }: `1 n  b% F解压tar.gz和tar包到当前目录
0 a& J: K, d1 n" l: j2 n& x* S' t4 G$ Z
tar -xvf test.tar.gz1 V/ n/ w6 z; l2 F: t9 p0 m( ~
tar -xvf test.tar
" }! }+ A# J% J! @- |4 S. X3 n解压到指定目录
- r; [; H7 y; P6 ]6 ?
" A9 n* m' r. w" C0 utar -xvf test.tar.gz -C dir. Q9 ]3 i3 U) e3 F8 B. J
tar -xvf test.tar -C dir
# R7 Z% T& C. h+ Q( N* C5 l, q解压包中指定的文件  g; a% w; ?' w; T, W, P0 t5 U
' r5 {; _- A  v5 `/ v* U7 d
例如test.tar.gz包中文件情况如下:1 I2 ^/ S1 b$ G, ]3 `+ @3 ^8 w
1.txt
0 O/ q3 K/ E# }5 L* Klog/: L& X$ Z5 V. q+ N5 B% z4 m/ U; |
log/1.log- D% D" ?0 w- d
log/2.log
4 [& Z" C3 W; \/ q8 |' R% ulog/2.log
, E% p7 p4 l+ f8 D& k; A) Glog/4.log1 R2 S+ h* [- ~: n) T5 C$ p9 c" n
log/5.log
% Z7 [. O* k# q, u1 S1 q6 w% X) }如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:  X6 G5 \6 Z5 ]) g) J9 z
tar -xvf test.tar.gz log/1.log! G! E) [& L4 J( h5 A
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录% Z# L9 r: J2 [! w/ v9 x
解压时去掉目录结构
! @# ^3 A+ X; m6 Y! s# S& n( h( ]* A& ]: c( [8 x
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):  {9 }7 S; ]3 {6 q
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
; a* O, |# {9 |" f6 D2 o1 ~解压时不覆盖原文件
% D9 d% K: q% c1 p
0 G, _9 P) ?% G/ M+ {当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
8 F" m) O0 Z: B% a' ?* Dtar -xvkf test.tar.gz6 C9 a+ A2 ^0 g# R- f6 u
特别提醒% F; P' _' i' R, r, B

. n3 t. f9 B4 S# g) ], [前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
: K7 y7 ~3 Y* ?( azip/unzip- b* j6 A7 {4 B3 ?/ T
5 |+ _9 @1 V; G! T2 Z7 W
zip和unzip命令主要用于处理zip包。
' F/ ^! L1 Q$ d压缩
+ k: J* Y! t$ d  Y* _$ D+ Q, U' q  A3 I' u: [, `/ `
涉及参数说明:
1 X2 u9 N5 M3 [5 x1 T: E/ J-d 从压缩文件内删除指定的文件。- E) Z- f) _3 U) U9 R5 V
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。, v9 N! u9 w2 H& w- S+ ^
-j 只保存文件名称及其内容,而不存放任何目录名称。
8 y. h1 C' x/ |, \5 G2 t-r 递归处理,将指定目录下的所有文件和子目录一并处理。* F% I6 i7 m' w. T. t! a
-u 更换较新的文件到压缩文件内。
& u) o3 R  G- V, ?/ D-v 显示指令执行过程或显示版本信息。: z  V+ L) P+ r: V2 C5 d
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。) `% B8 k, {- y; v8 {
- <压缩效率> 压缩效率是一个介于1-9的数值。; z1 U4 E6 G) m( L
压缩文件
2 t  \9 w( b4 e/ \! a7 d. e$ l: G( a; V" B7 Z. }4 D, g
zip -r test.zip test/ #打包test目录下的文件
% |! d' J' J9 U5 u) G: Y! b7 ?zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录8 F+ o# _6 N8 ~$ u' n# w& c
指定压缩率打包文件; T0 y/ x! c2 X: n" l

$ Q+ Y  y  q5 M: U, n" Vzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
; ^/ c0 Q1 ^6 r  v, P3 x打包符号链接文件
7 z! w/ |* l% X9 N' z6 V5 q- ?
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
) V1 U0 P+ x; {zip  -ry test.zip test
4 f- z% C, m5 b1 {向压缩包中增加或更新文件$ P7 v5 K6 y4 ?# _2 g2 y% O) k

  M4 ~+ w  ^( _8 C' x有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:' [' F" ~1 s& {+ |' _4 ~
zip -u test.zip test2 #向test.zip 包中增加test2文件& I; B, z# \) _" N: j
压缩时加密
6 N# V- _5 z3 H# B* Q2 c9 S/ t
9 G; D+ m, P  V4 Y6 `1 G压缩时如果需要对压缩包进行加密,可使用-P参数:
  G4 B7 w3 m3 G  k- ]. a5 Yzip -r test.zip test1 test -P 66666 #使用密码66666加密
9 m8 N; L7 R3 n8 @4 I! s删除压缩包的特定文件
2 F; ^; W+ V; ~6 C- [+ E6 f0 i6 h, c) n
zip -d test.zip test  #删除test.zip包中的test文件
0 j/ A% e. b3 Z$ t解压2 L# f# z' q) L" J

! {9 C5 |  I- ?# x9 k/ `  a+ _涉及参数说明:
; T2 u# B. ]  S( |- |; c- C4 @- ]' h-l 显示压缩文件内所包含的文件
3 j# d2 |$ I& ]* `8 c' U-j 只保存文件名称及其内容,而不存放任何目录名称。
$ [6 k. ^+ T- T6 v-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该1 i. y4 i- |2 d* _+ F8 K; d
-v 显示指令执行过程或显示版本信息。
# F9 H. V' n9 U4 i9 I9 I+ \-d 指定解压目录,目录不存在会创建9 E$ E1 ^/ x/ m, q5 a
查看压缩包中的文件信息- D9 u7 ~$ c; {4 i
2 o% B& C  q' J1 `
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息% j; {+ _0 f8 N( W+ I; B
unzip -v test.zip #查看更多信息,例如crc校验信息等
% d- b, I: w# V' f- u解压压缩包
  K% M' k; r$ y5 K1 i
2 P7 g' W" ?6 B- V1 Eunzip -o test.zip -d dir #讲test.zip解压到dir目录
% D, ~! U! S: g2 A$ H解压包中指定的文件
" `4 m' ^  N; H. O. I! n7 p% W8 T$ \* f2 w  [* |
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:; x( h- Z; N% M/ K
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录6 p6 g# r+ N% s" b2 H( V- z; j, D
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
  ?; }8 c4 r2 n' ?解压时去掉目录结构
. s& o! X# l; Z' z; t0 `
0 l# @# F+ Y# A& k2 S1 J, E- v压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:9 x+ p* u. s' D( {1 }3 B5 |5 W1 p6 j: q
zip -oj test.zip -d ./temp  
* B9 m7 a+ |8 G1 A解压jar包
  V* f; o9 ]0 y
# Y( [3 U6 L) w& h% V' Zjar包是java归档包,但同样可用unzip解压查看里面的文件:& n7 N) p* J! \8 y+ F2 s
unzip -o java.jar -d dir* T4 Y& I% l. y  d; K( l2 T. f- |
gzip0 o/ Y. C! O2 l
) z8 P; T6 ~9 s" V  O" q/ Z& ^
涉及参数说明:
2 w+ v# u/ {2 }/ H9 `-k 保留源文件7 Z* u. x! v" ]
-d 解开压缩文件* J) `* y( s$ h- e
-r 递归处理,将指定目录下的所有文件及子目录一并处理2 u% W; j3 o$ }/ p: N
-v 显示指令执行过程
% r/ B: p7 L, U4 q5 V4 Z! _( ]/ Ntar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
) @3 }% C! n! Jgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包# [5 `( J/ C9 l% e" v
gzip -rkv ./* 递归压缩
; D' i) |. B( F解压也很简单:0 p* |, d) g  w) ~$ w- ]  `
gzip -dv test.gz
+ w- Z9 [5 J. @& A6 @5 w! o: cbzip2
1 m: I$ J1 C. y9 Y4 y% g& T/ {/ e, m
' F9 _! z9 A" ztar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
+ J! F8 e5 r( x: Y/ Dbzip2 -zk test  #压缩test文件( I' i; y: p& }; p
bzip2 -dk test.bz2  #解压3 }$ J. H* I& d  |# W+ k4 o
rar/unrar0 A. `/ m7 y+ j4 e7 w, V

$ w/ O8 I* A) z. Z5 K  urar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
) x2 N" Y: o4 i; g) h  ~rar a test.tar test  #将test文件压缩为test.tar
" m; e( S6 Q: c  K$ f: C# {4 Urar e test.rar       #解压test.tar( M  X8 t6 h; l# n
unrar x test.rar     #解压test.tar
; [# v; q5 a/ U! _压缩率比较1 y. r" {6 H3 _' z* m% S) H
! l. s% C4 W5 z+ f3 U
压缩率一般来说:
1 A6 p' t' i$ B3 G" u, x$ Ktar.bz2>tar.gz>zip>tar9 ?# [  z: Q! o! ?! f
压缩率越高,压缩以及解压的时间也就越长。
# {6 h7 R* }8 n1 b/ {总结, ]3 r( K# v% d. H1 P
4 H) u9 z4 d5 k- v: W, J8 `
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
$ H/ e( `$ ^$ p3 Z( |3 j& Z有任何补充或建议,欢迎留言^_^。7 V- q* ]; H5 s: Y- ~% O

; d: j, m5 k# f0 _/ W5 F' g
2 [5 }" `+ Z: M& j
* w6 E; a; S2 y& c; X  t
: @* O6 Z3 x' d4 |% W4 [9 P) w

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-22 07:48 , Processed in 0.046758 second(s), 33 queries , Redis On.

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