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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
3 t: Q2 m) @. c& G  y( k+ {

: i+ a& _* {: b0 k
4 }- `- ?" w. |% J% I8 S5 w
前言
" Y+ q$ l' s+ e! \3 a2 Y% Q
+ Q1 d6 ^8 q, G# W. aLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
1 b& n" v1 h. Star0 t# {+ s/ P1 Z0 O' Y# {

9 y) k3 w3 n' Z& {5 a) Xtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。; o$ Q6 v+ y6 Y8 |+ U
涉及参数说明:

% G% ^$ m+ F2 E-c 建立新的压缩文件
" M4 s4 w9 i. }( }; P" _-r 添加文件到已经压缩的文件" \3 i0 q0 R% A& c
-u 添加改变了和现有的文件到已经存在的压缩文件
" [$ q) h6 Z) D0 h: m- B9 d) Q6 K-x 从压缩的文件中提取文件3 ?1 I7 ^  a! \0 X' o# S8 J3 I% H
-t 显示压缩文件的内容
1 @9 W3 x5 ~+ U+ w0 R-z 支持gzip解压文件; [! g+ q; q1 R
-j 支持bzip2解压文件* X5 w3 C& k# A' U
-v 显示操作过程
7 D  x+ O+ g& L; B6 ?-k 保留源有文件不覆盖( ^9 A( |& B& j
-C 切换到指定目录* M0 T; k& h" y( Y- \( n% J
-f 指定压缩文件9 ^, Y4 l0 C% [( w2 n- j8 H7 L) S
) [$ k9 \* i6 Z; B8 H7 f( \
--delete            删除包中文件
9 j; ]( V  k- _& p* @--strip-components  去除目录
! }5 g, D9 w6 k0 F4 o--add-file          向包中添加文件) K" m+ z- S4 n
压缩$ \5 c0 y. K! P6 q9 e; g' g
2 G* A' I6 q0 n* W* U
归档tar包,不压缩
; N4 k1 W! N. o) Z, i, M( j$ _' }- X5 q
tar -cvf test.tar test1.log test2.log #归档多个文件2 c0 m7 l1 S% }9 M
tar -cvf test.tar test/*  #归档test目录下所有文件! t8 d  O' W9 N0 T
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
* _) m9 C+ {$ V% n由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。" R% m+ S* c' N. \9 k  L$ t- H
归档并压缩为tar.gz或tar.bz2: I! y7 Y: s" s- t

  r$ z! Z/ J0 X' y' w这种方式打包对文件进行了压缩:, K5 q" G4 c9 \* K! W) H3 T8 ^$ ^
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
1 `: q5 b* N& ~. o* Qtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
# ^7 s0 I3 t! k" h4 ?0 J查看压缩包中的文件/ e* v6 C$ N: f  d# T

* Z. ?+ \$ f# J/ a6 d  @" _5 T& W如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:' r" j0 W" O3 e, q' l  @5 {
tar -tvf test.tar #可查看test包中有哪些文件
) r: |$ I7 Y$ S" O0 g- L8 A打包后删除源文件" t7 k6 G2 g# `& X/ @/ I

3 Z  Y$ R2 c7 ]3 z/ z, E有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:: O/ @4 l3 w8 O0 X1 [
tar -zcvf test.tar.gz test.log --remove-files . [' k  u- R+ V3 r1 s  I4 |  h, c
打包除指定目录或文件以外的文件
1 o9 Y% C0 Z! v& O
* f/ q" E4 x3 C6 X对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
" \; E( @! x7 B9 O/ {- ztar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
9 ], g: B5 u  @( U, s$ w( T这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
# j. g. }4 f2 h( {向压缩包中更新文件
  t* r: K% s& h5 Q# Y6 `+ m0 v3 Y% G" V9 o/ t2 f
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
* V  p! x  [' p" L  U2 j4 @tar -tf test.tar --add-file=test #只针对tar包: V5 R1 C, g# Y5 h
向tar包中增加文件
/ [. x9 ~8 {" e! \  X
. x1 |: L" I+ V5 z9 L向tar包中增加文件可使用-r参数:
+ E4 k5 ]" @+ Y1 x- k: _tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar, [+ ]( m0 s9 ~7 B
删除压缩包中的文件
, n7 k' P5 M* G4 i. j
: X/ |0 ]( ]% K  A在不解压的情况下,可使用--delete选项删除包中的文件:! D% _! x) W. {0 l6 A" V+ |
tar --delete -f test.tar  test1 #从test.tar中删除test1文件7 W/ |. {) r7 Y7 @3 G
解压# r" U) E8 P3 x- O; e
9 T& V- ?/ o% M; {: B3 ?. [
解压tar.gz和tar包到当前目录- i- y! P  n8 m/ R' u* F
* j1 ^. u5 i# A, F
tar -xvf test.tar.gz! e! T- I4 C; F5 e+ N+ ~7 ?6 A
tar -xvf test.tar ) t# y2 ?/ ]" J) a  O: }
解压到指定目录7 r2 b8 s  N& H0 {' t: d* O
9 K5 D: Y- x: u. d0 x, b$ @9 x
tar -xvf test.tar.gz -C dir
! C8 {# @2 [' `& Z7 k5 Gtar -xvf test.tar -C dir
) h4 F8 b0 N+ t+ ^6 T# k9 A解压包中指定的文件
5 a+ \1 K/ W9 S8 U- n; a8 g4 x$ `' y9 ]2 h: E* C8 ?3 H: e7 x/ P/ @
例如test.tar.gz包中文件情况如下:
& B. X9 |! t0 B5 F0 w1.txt6 \$ t  n. c% Z# g+ r3 B1 w8 O+ z
log/
  w/ o3 {4 a4 slog/1.log
6 X7 @" [* {6 x' _+ A: Qlog/2.log, P! }) }: h  O: z
log/2.log0 l8 E. H2 d, a1 e' c8 ^+ j
log/4.log& M5 G, Q; z; @) e6 Z
log/5.log
; v7 i' q" I3 K5 S0 |如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:0 }. F2 H( i) h
tar -xvf test.tar.gz log/1.log
) C0 ~5 `3 N1 w: {tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
  K+ W: b9 `( u* _解压时去掉目录结构0 H4 H% |  b- ?3 b1 }
9 D+ y" ]' g* K* U* i3 S
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):8 W  O- T, [3 P  l
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
! w* ~/ F$ `  f3 t, _; v" U解压时不覆盖原文件; g( \6 w; B' r2 j( f# T- q
/ F0 ^$ o6 S! S
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
* r" [) d+ h7 a& k% \tar -xvkf test.tar.gz
" u8 K5 w) L7 @" B( C# n特别提醒
: Q' ?+ F5 ^. H$ B& Q* q" f# @: I/ C+ q9 F/ C
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。9 s7 H) X- z; }8 R
zip/unzip; e" Z7 j% i: m6 g9 p' q

+ L, q* F  h4 |/ o& L. ?zip和unzip命令主要用于处理zip包。, \5 T0 ]5 \9 K, N$ W9 y1 q4 h
压缩- C5 ^" q) u) z7 F" G( A  f3 @

# G8 ]9 H# m! Q$ g涉及参数说明:
2 X" V9 r. e: M" S: z. `* L-d 从压缩文件内删除指定的文件。
  L# j! b' p* `$ ?# z) y" I-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。6 t8 ?  S% S4 z- T+ \6 s0 f
-j 只保存文件名称及其内容,而不存放任何目录名称。
2 |/ \  x# c  B4 ?-r 递归处理,将指定目录下的所有文件和子目录一并处理。
( m+ G, R. \8 n* r/ T" ?2 L-u 更换较新的文件到压缩文件内。
) z" J7 t$ r: X7 r2 k& G+ f-v 显示指令执行过程或显示版本信息。
/ D' v- `: `: `& z8 C% G. h5 b6 @+ p: f-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
% i5 ^1 E9 {8 P* ]5 D) ~- <压缩效率> 压缩效率是一个介于1-9的数值。
( S+ R0 P7 Y  b5 r( G压缩文件
' `& n4 K3 G5 d$ L/ \
5 l4 `. {  \7 @) [: U# H! m8 Qzip -r test.zip test/ #打包test目录下的文件
/ u0 g# e6 t1 H9 I% ezip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录4 ]" \( i7 `; C# a/ R" n
指定压缩率打包文件
! Z( t9 q4 u, F
2 A+ q5 S% O! t/ rzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
/ V* f5 ~( S1 o! q6 n2 q' S打包符号链接文件
% V6 `2 W5 g7 L, ?. U- K+ A; \' T. M  [0 u3 e
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
! X& H8 j2 x$ d1 Q8 S0 [zip  -ry test.zip test
( g/ `* h/ w9 t2 v7 ?向压缩包中增加或更新文件8 V* U# r( q) e' P

* q8 g; T2 r6 G" _! X3 X) A" A有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:: G5 L2 n. |$ r2 f9 y( }) B& y
zip -u test.zip test2 #向test.zip 包中增加test2文件0 ?! q6 E; G. E' p0 k
压缩时加密. l8 ~5 x; X2 p# \

5 X* H3 P6 {' m1 N" A压缩时如果需要对压缩包进行加密,可使用-P参数:; G- \, g4 \$ Y. I8 u
zip -r test.zip test1 test -P 66666 #使用密码66666加密2 Y& }( D- ^. y, Z
删除压缩包的特定文件4 O+ ?: `* K$ \% G
- e$ g; Y  ]  D( r
zip -d test.zip test  #删除test.zip包中的test文件' f. {$ Q6 k' J3 }) K; G+ u- U
解压
$ {7 Y! c( H* V6 ^0 C4 Z0 d+ ]5 V' ~! k
涉及参数说明:
; z; Z# k% H% F, T# z, P2 {-l 显示压缩文件内所包含的文件
9 ?$ x  w) U: D! x! D-j 只保存文件名称及其内容,而不存放任何目录名称。; m8 C' k+ o" _8 A6 [4 W
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
- g- X; N% E- @+ P' T-v 显示指令执行过程或显示版本信息。
1 J% H' Q& m# v# t8 n6 U-d 指定解压目录,目录不存在会创建" b# C$ @( m$ f
查看压缩包中的文件信息* W2 x0 k$ o. I4 A6 w( o$ q
4 z+ w1 [+ I, C8 W- b
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
( j- V( z8 P8 a$ D9 U* ~unzip -v test.zip #查看更多信息,例如crc校验信息等7 v5 f: w, d- ~1 o" F" w1 v% J$ Q' }
解压压缩包5 y$ U, E: K- |

3 @( F6 q0 |1 _* A3 Cunzip -o test.zip -d dir #讲test.zip解压到dir目录) p) S2 E, M7 z- Q$ D
解压包中指定的文件
5 P& i1 H, j7 o9 Z& q9 l0 w- e& L. M
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:! @0 y7 g7 P( u% h
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录1 \( B" M/ O2 g/ W7 o* R6 t, G& P# N
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
) g3 w4 F9 |$ y8 _解压时去掉目录结构! m8 x! W  D% I
- z) o9 N5 b# I1 f2 B7 N# w9 g
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
% a0 X  F" p5 ?5 _, O. Uzip -oj test.zip -d ./temp  
- z& d9 M. |+ R  q' E解压jar包
  [0 e" P2 x1 {7 _4 M. g8 C
1 Z* c+ O: }  Q: Ljar包是java归档包,但同样可用unzip解压查看里面的文件:5 R+ _5 P3 A  s7 \. x+ U7 D/ c
unzip -o java.jar -d dir
' [( g; a/ Z, w1 l% Y8 n6 Vgzip
0 K/ p! ?. z& L4 x; E( c* x& W7 s% }4 U9 C  p* d
涉及参数说明:
8 e8 a1 v$ \# }; K( T# }, P% o6 Q-k 保留源文件, B& t7 a& J2 t! X+ R1 J
-d 解开压缩文件
) P+ x3 L4 K- m% W7 |: O0 Z-r 递归处理,将指定目录下的所有文件及子目录一并处理" v7 H/ P/ M0 k1 e3 {" }: a
-v 显示指令执行过程, P+ C9 J8 C0 B+ n
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:( W2 V! l; Z* w. T; Q! B( {
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
" y- a# j- ?- s0 |+ E* h- l' Zgzip -rkv ./* 递归压缩% G# n& S( \5 i$ g7 W: }: o( t* a
解压也很简单:
# E! O; d5 S  e$ Ogzip -dv test.gz
- o4 ^2 Y+ }) Y4 b9 obzip20 Y7 z3 W8 X$ k6 [7 |

% e* X- D0 Y4 @2 @/ P6 vtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:' r+ H, H! \1 R) i. Z  c* Y0 @3 F
bzip2 -zk test  #压缩test文件
. Q! t/ o8 o# n( ]$ Ybzip2 -dk test.bz2  #解压
. E/ x, A9 Y7 m8 ]rar/unrar
% D6 _/ }. i2 D- y6 H- E( U- O% l+ E, m! g  Z, b+ m$ j
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:+ N/ s  Y% p6 j9 Y7 L2 {2 r
rar a test.tar test  #将test文件压缩为test.tar
2 o* |' z5 `% ~& m2 brar e test.rar       #解压test.tar
7 {( M% k/ {. Wunrar x test.rar     #解压test.tar
) T6 S8 R0 U  `0 H压缩率比较1 F2 U) |3 \, k9 s2 ?$ }. e4 Z% V$ ^

9 s/ x& m/ j; e* K压缩率一般来说:8 C* y: a) O; g2 r& R5 ^/ K
tar.bz2>tar.gz>zip>tar" g: Q) v  G, q# q
压缩率越高,压缩以及解压的时间也就越长。! e# }% o% R0 r  [/ p+ k# t
总结) [* q$ U' h) E& t

# r0 c8 B! }+ d" K对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
) @2 D* w" A5 o$ t( L9 w( j有任何补充或建议,欢迎留言^_^。9 J- d9 [& `* c# W
! G1 `& s% N; e) z+ B
# \- A' H' S( A6 v& C( D
. t' c" s1 o3 e' C& ]1 W
% |) _9 M; ]; y

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 21:46 , Processed in 0.061416 second(s), 32 queries , Redis On.

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