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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

: W3 C9 B2 S; L: X
6 F+ X. J# a! T- q. N8 d! o

& ]' s5 K8 j# ?4 P1 Z前言7 w) X+ [5 v5 |7 a: n

) _% f+ o1 \; g! m! H8 f0 W, s: nLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
% o8 g- L- e# ^! G9 t5 ztar
2 E9 m. L  g+ d4 @4 \
$ g) W: a7 K* }tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
4 }5 V. Y9 K/ [涉及参数说明:

. I" l0 _( }' B. g- K7 c7 k-c 建立新的压缩文件
' K" ~7 P5 \& v: `, o-r 添加文件到已经压缩的文件7 ]( J) d4 K  @- ]
-u 添加改变了和现有的文件到已经存在的压缩文件
5 u1 V% S+ n% M/ v2 e+ I-x 从压缩的文件中提取文件
. `& D7 i8 e' \, T: F: W-t 显示压缩文件的内容4 ~" X8 I' s7 k  b/ L
-z 支持gzip解压文件3 A! o/ u; y: j6 t
-j 支持bzip2解压文件
7 D2 [/ T- i4 z1 n/ R# P. R8 x( q-v 显示操作过程
( k1 M4 X7 k6 T5 b* w5 P* y-k 保留源有文件不覆盖
  N6 r2 F4 A% Y( |- x-C 切换到指定目录
- N( N, w  x' v' b/ r-f 指定压缩文件6 I9 [7 C/ G3 y. l: t  }. A6 F

8 q' a. H- n$ r- t! c4 \--delete            删除包中文件+ z4 u. U7 v4 C7 @& E) S: |
--strip-components  去除目录7 j* N* i9 W0 N! {0 H$ r4 [
--add-file          向包中添加文件
% n* Y( \  z! l( m压缩
/ n/ [( C' I7 r3 L% i* s( K$ Y/ S  [' T6 r* ~5 z* y6 U/ N2 N) \
归档tar包,不压缩  W. e9 M* L4 f) q7 U+ c

% v- |! V+ G0 Q0 Y  O( ]# F( dtar -cvf test.tar test1.log test2.log #归档多个文件
- F0 q  c8 O, m: ]$ ^tar -cvf test.tar test/*  #归档test目录下所有文件4 d4 h, X' E  f0 g. c; f' F
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 3 Q+ z: i. v3 m+ J# o8 C
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
6 y8 s5 v0 w0 l' u* p! p归档并压缩为tar.gz或tar.bz2
# v# k& \; A/ z' I  }5 Y! U* v  n
这种方式打包对文件进行了压缩:
# I& e, s* ^2 utar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩4 \7 W) @2 ~( s; @2 |' ^
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
0 ^; S7 v9 t2 ], J* b2 @查看压缩包中的文件
" n, g$ o) }( _5 f* y. v5 T1 ^2 Q# b7 P- z, }. J, \
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:  o9 T- Z3 @+ a) V
tar -tvf test.tar #可查看test包中有哪些文件0 X5 s# y' E+ G% f
打包后删除源文件# u, v. w: `; W' Q" p# ?$ a& K0 u9 F

/ [  V+ ^: `* m2 a# }# Q; s有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:, s$ D* x9 `) T3 i  D* ]' L. \
tar -zcvf test.tar.gz test.log --remove-files
2 m* J0 i# Y% ~% K% s5 G/ Z打包除指定目录或文件以外的文件
* X8 F! [5 a: T# ^+ f1 q) r2 K7 h' u: B7 G5 ~! b* p
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:8 I6 a/ ]' E, ~2 w" n; m
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件3 N, S' o7 E. @0 V
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
% O2 ?; T2 S  ~9 {9 c5 f8 C' ~向压缩包中更新文件1 z! V7 T5 \& S( I1 T& i5 {$ w

0 `5 @' z; ?+ d- v' L例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:% A2 n- A2 C; m
tar -tf test.tar --add-file=test #只针对tar包
3 [* U5 I6 d5 M& N8 e, ]4 f向tar包中增加文件
" ?& n$ z7 ^, S$ j. @" Y2 |* [3 {5 g& x
向tar包中增加文件可使用-r参数:) T! h2 ?' e- K+ u8 M
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
; Q; a0 z, Q' T$ ?+ L7 t; ]删除压缩包中的文件: u$ x7 R& W  w3 I9 S7 J
* \* b- S' I; W
在不解压的情况下,可使用--delete选项删除包中的文件:" a! @  o9 y$ @8 k
tar --delete -f test.tar  test1 #从test.tar中删除test1文件! C5 b- c1 ~9 G- j* {: N* V- \
解压8 e+ p( P2 O$ [& f
$ g  v( ^7 O; R, d
解压tar.gz和tar包到当前目录
5 _6 k6 p( C5 H
" m2 I( B# o5 |0 M) Z) I% itar -xvf test.tar.gz+ u7 w3 x* N* ]8 \
tar -xvf test.tar
+ q7 h9 O. Y- X' [解压到指定目录  d' P$ O3 q, C( h2 m

' a4 ^7 `3 U' j( I' O' otar -xvf test.tar.gz -C dir1 Q! q8 B$ ]+ H( e# l: x. c& N. h
tar -xvf test.tar -C dir
) @4 Z$ M: Y5 w: t9 v解压包中指定的文件
% W8 i9 [/ X7 f/ C$ p9 ?
7 f1 Z5 ^7 s1 k3 v  A9 r例如test.tar.gz包中文件情况如下:, y4 D( Q8 i8 V' @5 ~
1.txt$ t$ e5 [! V  W/ X, j1 n, r
log/: r- ^& R/ Q* h6 O8 s0 V
log/1.log
7 I9 r* S; ^6 O. y6 h. R4 C. w9 Plog/2.log
  C3 f1 \: W) ^4 y  t; p0 flog/2.log  t) q3 w: ?' L" r( b
log/4.log
( M3 F2 W: b: R+ I7 u1 B/ ?/ {log/5.log& Q2 l% f9 a5 v- m* D4 h$ z" C
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
4 G4 A& G7 V$ Ctar -xvf test.tar.gz log/1.log4 Z( s9 e' q+ [4 M5 E
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
: a' C  j0 u+ k解压时去掉目录结构" _1 t5 k. p- [( h2 ]  r

& U7 Y/ W: r5 D% B$ W3 [! o  y压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
5 x7 C4 P7 r  N5 n5 S' ?tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
3 k, P( G- ~1 B8 T3 t0 X解压时不覆盖原文件
$ \. Q, A/ G- W9 [: S* |1 i- L) l+ V6 M3 }5 ?  H# H( S& ?) B
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):3 x3 ^7 I4 P! n" S( H
tar -xvkf test.tar.gz
0 F; Y. H! W! @4 c' c0 l* U特别提醒
6 u8 j# j1 c- g6 F% D' E2 D( O7 Y9 L% M, y+ N1 O* `
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
  m/ O7 w+ I: ^5 R1 W2 u% Fzip/unzip
3 E" ]* F+ p8 c7 q
3 V( n7 {; ?& K, t, ?# k  m  S. I( Vzip和unzip命令主要用于处理zip包。! V* W; l5 i! q8 [: S9 D8 _5 e4 l
压缩
6 y7 ?  t4 n- i  y- P" |: C  g- z3 U$ Y; I0 M
涉及参数说明:- }/ H- o, `0 O, _7 u% y6 a9 x  S
-d 从压缩文件内删除指定的文件。
# r: s7 a0 F2 e5 b-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
: O7 K( v2 O4 l, l-j 只保存文件名称及其内容,而不存放任何目录名称。
7 J  v( X: B4 [: b* |  }-r 递归处理,将指定目录下的所有文件和子目录一并处理。
! E1 e7 j' F& B8 D1 i. h-u 更换较新的文件到压缩文件内。
  X2 B/ L) X0 w7 a-v 显示指令执行过程或显示版本信息。9 t& V& }1 G( R9 P# u
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
+ |: d# T  k3 E! @+ i2 E3 @- <压缩效率> 压缩效率是一个介于1-9的数值。
8 Y) @! x9 y1 b3 ?) V9 K, v, f压缩文件) q/ ?2 l2 K1 N/ d1 s1 b
. X4 d/ e+ U1 _$ R  @* u, t3 |
zip -r test.zip test/ #打包test目录下的文件
8 r; f7 |. C) B) x2 D+ ^zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
/ `8 i8 l/ v4 l6 C指定压缩率打包文件
1 R1 t5 J; \/ e6 J) S6 x5 d
  m  g& e* N# _- A5 X7 f# G7 a; d$ pzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长; d! c' d0 L" e! D- P  L- u
打包符号链接文件
! E5 Y/ M7 U; a8 |4 H
+ |5 V) B1 F7 |  j1 P# q前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
/ d; H0 G( i% |% \1 c6 i: w& Tzip  -ry test.zip test
' a) `  d9 Y. Z& [. S8 C0 {! S向压缩包中增加或更新文件: v4 P; |; j3 y; B. w: [

8 q# N0 h, o: U5 E" d8 n) d有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
: R, [- `+ g" Qzip -u test.zip test2 #向test.zip 包中增加test2文件8 b! g( u( d: K0 B1 L
压缩时加密
6 T% W( p$ J( O6 M* ~  n
2 a) ]& [! p) R/ U# I压缩时如果需要对压缩包进行加密,可使用-P参数:4 c. t- g7 K. A
zip -r test.zip test1 test -P 66666 #使用密码66666加密( `( ~1 `$ ]8 G( P
删除压缩包的特定文件
2 j# N1 d& t' x* q& n0 C* h  B9 K" M3 |" K8 q/ R
zip -d test.zip test  #删除test.zip包中的test文件
% V. Z+ N; U* H0 Z9 \6 R) k解压- H: h" z  c& t) V0 C8 _

3 h$ `2 l& ?  ~1 F涉及参数说明:, h8 A( u" `- k" H" K" h0 h- y) a
-l 显示压缩文件内所包含的文件
: v$ G5 f2 Z$ s/ |1 r6 ?6 l- k-j 只保存文件名称及其内容,而不存放任何目录名称。2 P7 g2 ^: o6 R
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该4 }/ s9 c" t7 u/ X% W
-v 显示指令执行过程或显示版本信息。9 _, Y2 e6 D" \; `( x, t! q5 x
-d 指定解压目录,目录不存在会创建
: e; B* G) }9 `, ?查看压缩包中的文件信息
* B* Z2 o4 x3 P! p5 M6 Z" i# L8 d5 h3 _# C. H
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
8 N7 g* w: x/ y$ ^6 P& junzip -v test.zip #查看更多信息,例如crc校验信息等: {7 B0 T# s, L* [
解压压缩包
' e( u0 m  h. H. d  W+ z# J' x, f4 M! ~, D4 ]5 l% S. \3 ^
unzip -o test.zip -d dir #讲test.zip解压到dir目录# V0 T1 n" h" C) T" i+ m3 a
解压包中指定的文件
$ H# s0 L. D& i+ `) J8 D! `
, o6 Y* R- a! Y& T1 A" @. ~如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:* B0 f+ t* w# `' q6 a
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
$ K7 y) }9 C/ P  ?unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件6 K  b4 M# l5 G/ D2 \
解压时去掉目录结构
& _; ^; x& Y+ x) ]$ ]. }) ]* \! T, z+ B( E- t
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
" R2 U, Y3 }9 p/ l( jzip -oj test.zip -d ./temp  
. S' g0 v2 A7 E, X- D2 n解压jar包
7 P: e. x5 s% u6 a; b
; I3 g" H: {; U2 i6 b( Wjar包是java归档包,但同样可用unzip解压查看里面的文件:/ q1 J% R! g$ v6 J
unzip -o java.jar -d dir# a# [4 |. m$ P" q% _! B, U
gzip
% T) f4 V5 _. K6 U5 l/ _" ~( d2 b: j) J, F) A
涉及参数说明:
8 N9 ^' k; v8 r2 h) D0 b: m3 \-k 保留源文件$ Q. ^, o+ ]$ J7 H
-d 解开压缩文件, e9 Q4 U/ U8 {7 H0 Y4 N$ ]
-r 递归处理,将指定目录下的所有文件及子目录一并处理
$ C0 d. W# b7 X4 z% Q! t, m-v 显示指令执行过程& C& S, ?. \# K
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
! v7 q6 c. e) S7 b) t* Kgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包" Y7 i  b! H! V
gzip -rkv ./* 递归压缩
! }0 x9 n7 p: d, O% Z) w8 Q解压也很简单:+ _7 l: N+ t  i0 \  F
gzip -dv test.gz
3 _3 p2 P( W8 Zbzip2
  W  [( L' Q& _. B  j1 |$ P! d5 y5 m  H6 V8 S& K/ J
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
. m' N8 F# k( @& a% u+ gbzip2 -zk test  #压缩test文件
9 r# Q# j- a4 Ubzip2 -dk test.bz2  #解压
! v* Z1 f) j3 m% i1 _rar/unrar2 Y* d4 l$ X1 h2 g& t+ E: P0 o; j
3 \9 A0 G1 ~3 P5 n  v5 Q$ c
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:: t5 Y8 Z; S5 A' ~. Q3 }; K
rar a test.tar test  #将test文件压缩为test.tar
( P" v/ V# V" l% Q3 s7 Urar e test.rar       #解压test.tar
! \6 o0 p2 \  N* Gunrar x test.rar     #解压test.tar: z4 N& H8 x/ Z; g( t8 C/ F
压缩率比较! E. t8 v2 \8 V" T3 I8 R3 c: q

! v4 n- A3 a# l5 n2 ~, p压缩率一般来说:( o8 ^2 P, K* G4 W* n+ u
tar.bz2>tar.gz>zip>tar
' A: Y& a. j# k; W' F8 z' q6 s1 u压缩率越高,压缩以及解压的时间也就越长。8 b. \* X4 D' E5 Y& O
总结
/ m( s' ]8 L4 y( T1 ?& p2 d' G- V9 [, m9 z# B3 [
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。9 Q& N: v8 ^' B/ o+ \
有任何补充或建议,欢迎留言^_^。
/ L$ ~! ?1 ]5 C( Z, F: r  Z3 J. d. H  U8 t- e3 T; N
# N% u4 T( d# e# {

0 v% o# T; u) m. [: l

) ?5 X7 r  \: _) H

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-2 16:03 , Processed in 0.041489 second(s), 32 queries , Redis On.

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