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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

2 s' V' F4 X: Z2 j9 u/ ^9 g
3 i1 m- h$ g( U* R9 l9 }

4 ]: W! I! r8 X前言" K5 f' Z4 k$ ?) `, V+ U- S1 B1 _3 Y

7 @8 m1 |4 q# w7 @  ZLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
3 l" ~8 g9 Z  D, \) dtar
8 \" o0 C1 H$ F3 ?! K7 Y. O5 t( y
+ H+ O: R$ B$ r: }# Vtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
& B" }- E' H9 P# b5 V+ E1 _, D+ G涉及参数说明:
" n: ?5 d' y0 u; W
-c 建立新的压缩文件
. N1 z; r1 {% w9 \( _& x-r 添加文件到已经压缩的文件
) k1 z& S) G" e! {+ R- N-u 添加改变了和现有的文件到已经存在的压缩文件& S) J- B; D' k5 ~) H1 |, f
-x 从压缩的文件中提取文件& k' O) g+ G* d
-t 显示压缩文件的内容
: }# ~' _  B) d: ]$ a" m-z 支持gzip解压文件+ c4 j+ n9 l0 B6 v% x7 i
-j 支持bzip2解压文件
2 e" m( k9 m) ?/ F) P) e- s; E8 V-v 显示操作过程  ]; R' d& }+ L
-k 保留源有文件不覆盖
! ?1 k, {6 R2 E-C 切换到指定目录( p3 `% e" c# Q3 A1 ?2 b8 U
-f 指定压缩文件
2 t5 u5 P  Z1 `! V$ B: ~! C$ Z  Y8 r8 Q" c4 U: q* a" p: l
--delete            删除包中文件
/ L& ]+ Z5 n6 c  L--strip-components  去除目录
* ]7 H0 I7 F/ z% X6 V--add-file          向包中添加文件6 ?/ b# `0 k" e, j' |3 ?1 t( X
压缩
2 j# t, P1 E; f3 H. P9 y& S4 u  O1 G! ?5 E  R8 C8 j
归档tar包,不压缩
/ s1 S" P8 i) N4 S$ |) G7 |: e5 r8 G4 O
" ^6 K: o5 N# I9 c+ C. ]/ ktar -cvf test.tar test1.log test2.log #归档多个文件& V) c# T: U, ^7 _$ C) [, N
tar -cvf test.tar test/*  #归档test目录下所有文件
! ?; V: I' G- [0 [) \$ g/ etar -cvf test.tar *.log  #归档所有以.log结尾的文件 9 d% g' p& E, X/ S' B
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
  v2 i5 j5 D6 M  Y+ t归档并压缩为tar.gz或tar.bz2
3 h5 D( P! A& S3 R( F( ]: ]
+ K: |6 X; n! T, [2 N这种方式打包对文件进行了压缩:
4 x0 u8 U3 b" e' ?* t$ e( L- ytar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩* i- w3 F% T2 |5 W
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
  S$ j# S/ y/ f; w9 I( m查看压缩包中的文件+ W2 Z5 a3 G, R! G: u/ c

$ @  }8 N: w# I; |- z* `# N如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:( w! Y/ e$ u0 }- g# Y' S8 N
tar -tvf test.tar #可查看test包中有哪些文件+ W! p: W4 T- z* A1 v& v
打包后删除源文件$ c* q2 l, \& C# O
0 S$ n# A( f* }
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:) T5 w' h3 m" k' y+ J' L7 F) F5 ^' [
tar -zcvf test.tar.gz test.log --remove-files 0 k! R: G0 ^4 r' I! e* g
打包除指定目录或文件以外的文件
. v! ]% M8 n: t' ~3 c: I. K1 L
% H) y: E3 Q0 k! L% `对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
  r1 U0 m$ s" N+ d% K) Btar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件! s$ E4 w: F! }/ A+ }7 X' g
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
8 N* M) [0 q: g; Z; t% `) _# A% Y. ]向压缩包中更新文件
9 E! ?6 R8 w; F
& F3 {" p$ F; g: W& ~; o例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
( U4 Q6 n& ~% W7 l6 `tar -tf test.tar --add-file=test #只针对tar包
9 o9 P! l! A8 ?( k. j) C向tar包中增加文件& J# D2 U8 Z3 o3 f
) ?6 z( s, A4 V: c5 E
向tar包中增加文件可使用-r参数:
2 m7 ~* j" O% \3 Vtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar- c. o# v  @7 T& Z6 g
删除压缩包中的文件
# O. O6 w$ ]$ M
! M( g' U/ f0 l. y# w$ G# V, y" Z! _在不解压的情况下,可使用--delete选项删除包中的文件:! M  o: o% G$ w/ ?+ ]
tar --delete -f test.tar  test1 #从test.tar中删除test1文件2 ^- W3 \& Z& G
解压
3 f+ P& i1 W) C' D, r* b$ J: d
& h0 i5 l% {) u解压tar.gz和tar包到当前目录
% \' X* P& `" F$ J7 b/ @" Z& S/ v2 i7 z2 F5 Z5 |
tar -xvf test.tar.gz
  T, ]2 c  n5 `" s( Ltar -xvf test.tar
0 z2 G9 W. O  F解压到指定目录$ Y' U. @, f7 F6 p, C0 L
; i2 Q3 U+ L! R* Y3 s6 Z% x. M8 o
tar -xvf test.tar.gz -C dir
( [, O1 [4 t+ H; `$ A/ ]tar -xvf test.tar -C dir. J. E1 u; }- ]9 P- a1 p# y1 z
解压包中指定的文件& v3 F# ?- y. ~$ j. S8 g9 f
, A) b8 g0 E; R, b
例如test.tar.gz包中文件情况如下:3 ?( p/ E9 J5 q- C- |( J( T9 f" s
1.txt
6 H2 H! [% z! W+ q& tlog/( {- f7 |& I+ e. b3 y
log/1.log
, _9 K- ?) E) Elog/2.log- q1 |( {+ x) K: L1 x
log/2.log: z: h5 C# x) t$ L% X6 W3 R
log/4.log/ J! K2 s3 q5 D* B
log/5.log) J6 }2 b0 ~0 Z5 ~
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
: P! d% u5 B) C2 N/ J: U/ star -xvf test.tar.gz log/1.log
7 ^. H0 M7 B  u; }tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录' b/ M  L8 n8 W& C
解压时去掉目录结构' F: j) U' Q1 L; a  V4 S# S
) a1 \/ Y3 N2 `4 ~+ s+ C* @9 \* L
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):/ p. ]1 K& n( E. S' z
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
6 Z: ?) \& M7 }; ], E( n2 N- R- ~解压时不覆盖原文件; N# c& Z* P# k3 b, t' T/ |
3 {- C5 N, x! |! S
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
  Y; [, p# t, K* q- z3 Utar -xvkf test.tar.gz
# _9 d" u  j' c) k, Y3 U% f2 D特别提醒& k! [$ E, y: ?, m3 A, s6 P  c
3 H7 N2 h# k8 o8 [- R( X; d0 _) s2 j
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。+ K3 I9 U7 h1 _: G, h" Z: @  K3 R
zip/unzip8 {4 u  r; F9 q1 w/ v3 a7 L
; c9 K8 L. C( G1 C
zip和unzip命令主要用于处理zip包。9 e/ m& a) Q& j2 k# g* M$ E
压缩% d1 l9 X5 G0 k" ~# W8 r' @9 N
" c7 M! X* W" i; a
涉及参数说明:
" m6 \. `. z) X-d 从压缩文件内删除指定的文件。3 l" \( S, ]. f( N: Y1 m! `
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
6 L) d6 H  I5 g. y! B-j 只保存文件名称及其内容,而不存放任何目录名称。6 a+ K  S; L3 n; B7 K
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
, E" Z5 H, i+ B+ Z7 z-u 更换较新的文件到压缩文件内。8 A6 J5 }4 Q  I; m9 s- I( ?- a/ ^8 {
-v 显示指令执行过程或显示版本信息。# ~2 f: n$ S. q" g" @; p' c9 y' K
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。. y: G4 S! z+ Q. X6 P3 k
- <压缩效率> 压缩效率是一个介于1-9的数值。5 }6 N$ j$ t3 F# U$ H0 Q& U
压缩文件5 F  W" P4 K! G. R! w. S4 |. t( ^

) J: R7 `8 R5 |. \5 e3 ]* yzip -r test.zip test/ #打包test目录下的文件. ^( g4 _7 R, A$ z6 Z1 a+ C6 J
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
. ]- r: X  O  \0 A指定压缩率打包文件" x+ s" y( F; K& D
2 a, U7 m& I& D, A9 K) Q- d" f$ n
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
' M* Q, ^+ @$ i! E打包符号链接文件0 c' A  [' r* g! N7 d

' c6 F: _0 R0 e& g6 \: P5 v3 u前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:. O* z( x' t6 z+ t
zip  -ry test.zip test% H' ~+ P# n+ d$ J  u% @
向压缩包中增加或更新文件) b& \8 l! p7 g

9 `  R& n. v! A有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
9 u4 F# q8 N7 J% x2 Fzip -u test.zip test2 #向test.zip 包中增加test2文件
- }) L4 y+ l$ S7 E: s, h% W! _' `8 A压缩时加密
3 B# {, `1 T) `1 c' W% z( `  E( W5 Y
压缩时如果需要对压缩包进行加密,可使用-P参数:: \/ }9 ?% U( F
zip -r test.zip test1 test -P 66666 #使用密码66666加密+ }1 }0 b) R! O5 T
删除压缩包的特定文件, G: t: m* m& e2 o# W

% y: i( A/ S$ |zip -d test.zip test  #删除test.zip包中的test文件. s* L6 w* \8 m
解压3 V$ E& E7 ^; _6 [2 r1 k) |

1 f1 G: _( b6 }. y+ f2 ]/ L0 j涉及参数说明:( X$ a/ |1 |+ \
-l 显示压缩文件内所包含的文件
( \4 D1 S) i% C* Q. }4 k# B-j 只保存文件名称及其内容,而不存放任何目录名称。
6 l5 `6 `5 [( i2 R  O( [* [-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
. u( G( |0 Q1 u' n' Z+ }-v 显示指令执行过程或显示版本信息。% S& Q8 i: ^1 L: [9 _: r, V
-d 指定解压目录,目录不存在会创建
6 U+ W) N8 H! d* [3 ?0 t, L& y4 p查看压缩包中的文件信息# U3 e) o! B% n- E% b. U
7 ?2 A8 G0 P& f# w; p& c
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息3 U; Z- K% @( L0 r. `: [
unzip -v test.zip #查看更多信息,例如crc校验信息等$ O" N2 M! s5 f( |7 T: I
解压压缩包
" s/ ?, l1 q" v" Y0 s, Y
' u. s. u8 A7 ^7 r. vunzip -o test.zip -d dir #讲test.zip解压到dir目录$ b5 j  P+ z5 y. Z. S
解压包中指定的文件0 q6 R, W. L/ G+ N
& s5 ]; w0 Y; M
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
8 q; n+ m% c% l/ n% d( Z' r  w0 s1 ?0 Nunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
1 M$ E, Q, x4 O! x9 i0 x( j0 [unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
) n9 ^4 _6 f" O& |" U+ k解压时去掉目录结构
# Y3 r/ }1 n) B) y. f# `8 u' N" m, c1 ]" H9 r$ S- }, w
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:3 Z5 o/ N, T3 F' `$ l! Q+ z) V
zip -oj test.zip -d ./temp  0 b7 m5 i# u, E
解压jar包0 D! A' m6 {9 E( c: e( L
" u8 D1 G4 L9 p: W, a( M' y/ }
jar包是java归档包,但同样可用unzip解压查看里面的文件:6 a/ q6 }  I' D& t
unzip -o java.jar -d dir$ ^8 W+ E' P! V/ n/ Z
gzip1 `% h' `/ \% A  x0 f

; }: n4 `5 U+ L$ r, T0 P涉及参数说明:
, ^/ Y) N/ i4 o-k 保留源文件9 J# e4 F  G3 ^5 c. g
-d 解开压缩文件% ]) `8 Q* t- {0 D
-r 递归处理,将指定目录下的所有文件及子目录一并处理
: m- `4 @- O/ L) L-v 显示指令执行过程
# P5 `8 e8 w  v  g: j% ?tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:4 o0 A7 F$ t( ?) o: M; u9 k
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包* O6 F* a! Q! J; Q
gzip -rkv ./* 递归压缩
& [- `0 f& {% w解压也很简单:7 F( w# a& s: w6 {* O; k
gzip -dv test.gz
* Q2 q& h( @+ u+ V7 T$ Hbzip2
: b7 x% B7 ]( h* G* x3 m' o) `
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
% F. B* D$ Z. M( s. P9 Lbzip2 -zk test  #压缩test文件
; h, g  C" w/ L3 K8 P5 Ibzip2 -dk test.bz2  #解压2 l- D/ u8 y/ t" n. a. T
rar/unrar( A! M/ f. E$ c$ W
) o/ [) Z$ r6 F' O& q; f' a
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:5 ^+ u) K' q& {: D/ L/ s# l
rar a test.tar test  #将test文件压缩为test.tar
9 E* m8 `) `: Z- A  k9 F1 Xrar e test.rar       #解压test.tar
, I( o0 `$ W2 L+ `unrar x test.rar     #解压test.tar. |3 c2 h: N3 B( L
压缩率比较& x. M1 Z3 D: E' c

' k# S- }( p. K压缩率一般来说:
1 b* q: k4 h5 T8 Ftar.bz2>tar.gz>zip>tar' {' p, l, v% {, ^' x% f
压缩率越高,压缩以及解压的时间也就越长。
( T) u* q$ W8 P& ?总结
0 o! @5 x, i6 G5 r, z2 H6 h8 s0 T# r  G2 n+ d! ~: c; l8 k
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
) F( X) j# J3 r$ n9 p, Q有任何补充或建议,欢迎留言^_^。0 H1 U6 u& [0 C) x. Q9 ], k

( |( D+ `0 s, S8 b" k
, L5 L0 k' A3 Z$ U1 f9 D) U9 z  J/ ~

8 k: @8 ?1 n/ }6 K1 w9 c

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 02:25 , Processed in 0.080807 second(s), 32 queries , Redis On.

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