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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

2 j$ p# ^) r8 ?! y
: p) k8 Z, ^& v* x
9 a9 P" [+ U6 X- H9 ^% a  p. \
前言4 N' p$ N2 K4 x! R$ l
* f+ p! E1 t' Y( M7 N! r: j
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。6 x% r" v4 t+ ~8 P/ R$ e+ g
tar
, k" S: {$ F6 u0 J
8 r6 I) t; |$ Vtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。, X( {- ?5 ?6 l
涉及参数说明:

) k. e0 E/ _$ N/ P2 }-c 建立新的压缩文件' ], K4 B; Y* ^/ M) ?
-r 添加文件到已经压缩的文件& ?6 O) Q0 ]/ z
-u 添加改变了和现有的文件到已经存在的压缩文件
7 J& N2 R: J7 r, Q( n6 F5 x* o-x 从压缩的文件中提取文件. }: B4 V. G& Y2 _8 @
-t 显示压缩文件的内容
+ \& j5 C' I- l: s) D  h6 g. y-z 支持gzip解压文件
1 v( S) ]! d" E: s7 I-j 支持bzip2解压文件4 i  I. p3 o) F4 F, l7 A# g. u) b' U
-v 显示操作过程
' t: X& F5 J, d3 v2 A8 u, L& O8 Z5 v-k 保留源有文件不覆盖
9 [1 ?$ i* B/ X, v2 U( ?" B7 J& X. s-C 切换到指定目录
% Z) p/ K# S9 D5 g8 ]  a& n) }-f 指定压缩文件
7 r# O9 o! o8 z6 d$ J# y
9 C; C- V3 o+ T& U: c( B--delete            删除包中文件
+ u2 e8 w7 W; l/ W--strip-components  去除目录% m, {# D: n, V9 F2 f! U
--add-file          向包中添加文件
/ g/ l( S. d. ~% e% A压缩5 |! V/ i5 Y5 J2 g6 U' D: }

2 {& ]5 r& W6 S5 ]归档tar包,不压缩" I! E$ @- u& w8 F0 K* u* f

# Z6 j3 Z+ R0 |$ Q( s9 e" y/ V( jtar -cvf test.tar test1.log test2.log #归档多个文件
* A1 G% ^# w4 G/ C$ Mtar -cvf test.tar test/*  #归档test目录下所有文件
( O; O* U7 _; qtar -cvf test.tar *.log  #归档所有以.log结尾的文件
& U- T. C$ Z( @( a1 C# y* h由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。0 l4 F9 {, t/ i- _  i7 t* O# f& w
归档并压缩为tar.gz或tar.bz2
+ h8 G* |5 @" i- ?$ g+ I* r2 M& k3 p& z
这种方式打包对文件进行了压缩:# \* z3 {7 `1 ?# T5 y
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
6 r9 G2 m: `+ K! f# L" l- Ptar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩$ r! L+ l, k( J' @' m2 u
查看压缩包中的文件% y9 e  j: K% W

$ g, R! u& ]* F如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:  J+ {* I6 s" n0 n# g1 B. f
tar -tvf test.tar #可查看test包中有哪些文件
- v0 ]0 y4 M* ]9 x1 V, |6 t打包后删除源文件  `' T2 A( J# H" f! o7 Y
$ k( ]  g4 ~4 M5 Q% z1 j6 t
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
8 n" Q3 Q, }# e1 ^( H3 A2 S) O+ Itar -zcvf test.tar.gz test.log --remove-files 9 m7 R; d  p# w, n5 J' ^; b( G
打包除指定目录或文件以外的文件
: {! r7 z- K8 _% d3 M9 {! m$ i3 Q
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
& m" p( r" f3 Y2 }' ?  W) otar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件5 W: C$ l8 J+ n/ @0 N4 `; ^' C
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
; Q% Y+ o( O6 f, X) S$ j向压缩包中更新文件& ^0 r/ _, v4 X& G
, E( f" S4 J4 X9 E) B  X- _
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:. n. ]1 h% y4 A
tar -tf test.tar --add-file=test #只针对tar包7 q5 [' V' O" k' o8 z0 ]
向tar包中增加文件
  I) O3 j% o4 f: @8 d2 q& D' n% G  |& Q0 S# W( @: d9 b' \
向tar包中增加文件可使用-r参数:/ }  c" [8 [5 }# d0 E5 J3 t
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
% d1 ?2 T  ~0 ^/ o, s+ ~4 b, i% h删除压缩包中的文件
  d- c* G8 |, |  G8 E+ M6 |3 o
9 g% g9 y+ v- ~2 n7 b" c( K4 v在不解压的情况下,可使用--delete选项删除包中的文件:" u! h* @; @- j. |; L: P; @
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
! Z9 e7 x, T$ @2 X6 f7 _) m解压
8 r5 j/ x5 h& x1 c& C& s
* A% X' `  B7 l解压tar.gz和tar包到当前目录4 g1 A6 n# N7 L+ U- \9 m" m5 b5 Q% W( A
1 u$ {) r1 J% Y: i2 X- H
tar -xvf test.tar.gz
) ]3 J! `$ t9 A- a: N- P9 \tar -xvf test.tar 1 p  S/ H6 I* V3 v! {1 ?
解压到指定目录
  i$ u. `( Q1 j0 G
5 r, L' J0 |; K4 |6 Ftar -xvf test.tar.gz -C dir9 R, v' y4 w! N& `. K8 q4 o3 r
tar -xvf test.tar -C dir' D2 \* d# b8 o' X& n& a. L
解压包中指定的文件
4 A: Q1 ^+ _" B' B# h0 I
+ v, @  R" b5 P' O例如test.tar.gz包中文件情况如下:3 O* c) ?' g& e9 m" y/ ~$ \
1.txt
7 [; C) r+ a: P5 wlog/7 {1 x& S3 z) i9 P
log/1.log
9 j" ~  y0 O' N& M' G4 \- e3 T7 ylog/2.log6 v$ S  w6 f) M4 Z" a, S
log/2.log/ w0 c/ l" b! ~. `- ~6 X" j( ?
log/4.log/ I1 ^1 H: ?8 z# V3 u! v, ]% X- T
log/5.log
5 T3 x: X7 [% l3 Q# Z如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:3 v& ?2 A( p' O: M  u# N
tar -xvf test.tar.gz log/1.log" N: ^5 `0 c& Q3 z: S" b+ ]
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录4 n+ M3 A6 M1 ?( j' b8 ?/ J1 V
解压时去掉目录结构
, ~( W! l$ |% [( B9 S0 N" h7 r! k$ v" m  y" |& \
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
! d( j0 z' f0 \* Wtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
  T5 J; ?5 U' w# P/ h/ ^6 h+ k! o7 Q解压时不覆盖原文件) n- l5 y) M) n: r, o
. N0 }0 S) D6 {' M* e1 n5 H
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
! t* u. g( F& s7 O' Xtar -xvkf test.tar.gz
- p# }" x+ F1 ]2 r0 d特别提醒/ ~' b4 g+ f# u. t' a

3 @9 m5 Z6 @* a, H9 S2 V前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
; z8 |2 b: ?& H1 l: S# ~zip/unzip
! M( i0 Y7 z+ \& j0 B! Q( ?
4 t$ J/ [9 Y0 Q7 Szip和unzip命令主要用于处理zip包。
) Y  k. e/ m5 M( E; S8 Q! U- ]+ d压缩
0 H3 ?+ |+ s5 C3 L/ ], B' w& D: M! N. I* ^! E9 w
涉及参数说明:
6 n9 w2 N3 S) {0 K: {-d 从压缩文件内删除指定的文件。
8 \, c3 j0 v5 i0 Q' |5 E-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
3 E% }, S7 Q, P+ H6 n* A. `. V-j 只保存文件名称及其内容,而不存放任何目录名称。
$ F1 U  B5 Q) W# L% L9 ~-r 递归处理,将指定目录下的所有文件和子目录一并处理。0 e, B& D. _! T6 E4 d# x
-u 更换较新的文件到压缩文件内。6 n9 k4 F. r6 `% k9 C& c
-v 显示指令执行过程或显示版本信息。1 Q& p1 K! R! h1 u# M: l$ q; ]9 u
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。8 {  S; r. y. w
- <压缩效率> 压缩效率是一个介于1-9的数值。
$ A' e6 i' k; d; \压缩文件
/ x$ q4 Z9 M4 ~' I! g
4 c# Z( N/ j  d: bzip -r test.zip test/ #打包test目录下的文件* B" E& x( R1 M; ~( H6 P
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
4 s  a8 [0 i' h1 P指定压缩率打包文件
, @8 _6 n6 O5 J0 c) n+ t5 ~
& U6 Y: G$ Y: G7 m0 N" C; Q$ j( Azip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
+ F& l* \! r) a5 _$ C打包符号链接文件
  L  l  F5 A! v! K3 i2 ~( W/ S4 b# u' L/ C5 f, L" j
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
: n$ I1 E, c, G" Vzip  -ry test.zip test
/ Y+ I- T0 h6 b1 L( b9 T$ U$ e# F向压缩包中增加或更新文件
, Q; z8 H1 r4 D$ k3 l9 ~- ~) W4 a% V* j& l) `/ E, N$ g- d! g* y
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
, ]/ z. }8 `: w% m" f( _zip -u test.zip test2 #向test.zip 包中增加test2文件
% o* K7 e1 w2 Q# B& I3 z, A压缩时加密- [0 D+ F* ?9 L9 D* Z- @! ]

8 I3 k2 d+ g& q5 r3 U压缩时如果需要对压缩包进行加密,可使用-P参数:; `1 e" \+ E5 f1 p
zip -r test.zip test1 test -P 66666 #使用密码66666加密4 `% J: S% S% v* t- H2 b
删除压缩包的特定文件  e* q8 m$ K9 H5 S
, H1 |5 L* t- x0 ?: y( Q. Z
zip -d test.zip test  #删除test.zip包中的test文件
8 c7 ^* y6 S* @! `% a& F. l+ y9 Q# L  x解压
2 f5 f) @7 P+ M7 J; ~, ?
* c6 g  f) B4 V8 U) T# M  w8 l涉及参数说明:
$ I1 c5 f* f! v! K+ }$ b-l 显示压缩文件内所包含的文件' g1 M  ^3 `5 r
-j 只保存文件名称及其内容,而不存放任何目录名称。- u8 z; T1 o  n
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该6 O7 Y5 W6 a6 |; W: }6 t$ v
-v 显示指令执行过程或显示版本信息。' q, P! p/ T4 ]5 D, }3 {6 l2 N
-d 指定解压目录,目录不存在会创建
+ Y7 n) t8 `6 k' N9 N, V查看压缩包中的文件信息, B+ n: D7 [1 b
1 B: u5 O5 ], j# M' @* ^
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息* J3 |" A/ \0 ~2 a2 S
unzip -v test.zip #查看更多信息,例如crc校验信息等6 E% z* g# b  y! c$ ]# Y0 r
解压压缩包
0 T# L% Q% y  [8 r7 h) A2 x9 D) a' _
: [8 X3 D9 N0 R. Z$ `unzip -o test.zip -d dir #讲test.zip解压到dir目录
: R0 M4 ]0 U: K9 i; A解压包中指定的文件
7 G4 z7 V$ r; @8 d- V
. {5 I' O! F9 T4 j; T% M1 |$ y如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:- P3 R, O( `. n. n! s
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录! H+ f4 g' v/ t" U" f: h
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
3 `, S  I# x  J0 B解压时去掉目录结构
# B1 M* S: @  Y! @- ?
8 S+ q1 k- v4 x3 K* g压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
  j+ P+ ?0 F! w# V+ |zip -oj test.zip -d ./temp  
8 w3 J3 m; G. ^" |) D$ f解压jar包$ q+ x* }  T4 I6 T; ?) o- m8 X" R
  p* F6 b2 l" r
jar包是java归档包,但同样可用unzip解压查看里面的文件:+ l! ~2 ]8 ~8 H! S6 n. ~
unzip -o java.jar -d dir4 h$ s- B) m0 }, h
gzip, r$ [# y8 H, H- c
- M3 o  V( a# h% I4 a. C
涉及参数说明:
6 l. h2 x; Q# e1 K2 u-k 保留源文件
  D9 M0 ^4 v! s  ]9 Y-d 解开压缩文件
. u* B( V1 _/ s7 W1 f-r 递归处理,将指定目录下的所有文件及子目录一并处理
7 y4 [9 T- C+ Z-v 显示指令执行过程
) M$ @8 ]5 Y3 x' utar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:; U: d' A$ u/ O9 L( J7 K8 ]; ^
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
+ C9 _" z) [4 v; Egzip -rkv ./* 递归压缩' |) n" J( @  h7 y. X
解压也很简单:  V& \; a) u, h( y; B
gzip -dv test.gz
7 s3 Q" ]7 \, J  H! ?' ~bzip2
# g# S3 B" V2 }- v/ J& r5 N# U. v3 p, _$ D  y+ P
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:8 R& Z- W$ Y0 N) g- W) _6 f
bzip2 -zk test  #压缩test文件
' l9 M- k( U6 C; ^bzip2 -dk test.bz2  #解压+ H, a4 Y) x3 l: q8 W  p% I" \
rar/unrar+ L6 g3 N- {% p1 x) H: S( f
5 M2 q! l+ {/ W6 ^( H2 h# F
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
4 M$ v3 }" F1 b/ drar a test.tar test  #将test文件压缩为test.tar
" K5 F  j. l  I0 erar e test.rar       #解压test.tar
4 T' V1 E1 j- ?/ j8 [8 Bunrar x test.rar     #解压test.tar
3 Y) u- w0 v. M1 Y: ?压缩率比较" R/ |  Y7 e# H! P6 K
, p$ K2 r/ F" G; T
压缩率一般来说:$ ?2 _. w* o% M7 a& v/ T5 o0 F
tar.bz2>tar.gz>zip>tar& L4 N7 \& p  L0 ]5 w. L
压缩率越高,压缩以及解压的时间也就越长。
; }3 m' J6 A1 J4 x8 e8 C& @总结
) X1 p0 v) M1 I. W( B3 I" i# W5 K1 m7 G/ I- [1 B. X- k  o4 k
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。  {- G( G/ p4 ]8 A' B0 O8 f( B
有任何补充或建议,欢迎留言^_^。1 x6 Z8 D- ]# a2 l' J

; V! a: H- _$ G" \( V3 b' t+ S8 C4 x1 X) U# F( w0 t

7 V) f9 L8 K1 g* S0 v* u0 Q

( D- g' S9 n7 I

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 12:04 , Processed in 0.064878 second(s), 32 queries , Redis On.

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