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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

( I8 y  W8 E: V4 h3 N
0 m4 N3 I0 G! f! u: L8 h+ O; u% |
, e9 F1 J/ q5 N+ l) K; M7 G
前言
7 G: ]* q4 S" _- T* G+ V
: s+ R4 j6 y$ e+ z% bLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
) x$ B5 {" p; M3 ?: H* Q+ c1 itar
3 L7 b. E7 M' J- z' U! O- w* i0 g* ^! e
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
3 ]6 Z  X! |  l/ c涉及参数说明:

* {( Z/ C) |( Y-c 建立新的压缩文件! O2 u, Q6 }8 s
-r 添加文件到已经压缩的文件% T7 _1 N; ?' B2 p- c: Z; }& |
-u 添加改变了和现有的文件到已经存在的压缩文件- w: k/ U6 A5 @3 r
-x 从压缩的文件中提取文件. v  u8 |6 L! j; A" h% _& [" S
-t 显示压缩文件的内容8 `& K; q. v  `- c8 Q, o7 A. ?3 r% K
-z 支持gzip解压文件$ Z$ ^: R: |, `% W4 \  v- j% ^* n
-j 支持bzip2解压文件
' ?# U# K9 r: x-v 显示操作过程- I( |5 J) M3 c+ S
-k 保留源有文件不覆盖
( {+ @- \' G, {8 O2 I9 S- R+ Z-C 切换到指定目录
3 Z' g9 y! _" S0 j, r! V8 ~-f 指定压缩文件
, A2 e7 o' M( U1 k0 H3 o; o# T2 j  k  O) |* }8 U
--delete            删除包中文件
/ \# l+ }: s$ I. ]9 S5 J--strip-components  去除目录
2 ?- J% f% i( B, h2 l" L--add-file          向包中添加文件* T; o) `( n, G
压缩( {) R8 b3 w4 A; t
& c( y4 E5 M# f! Y. I
归档tar包,不压缩
9 N  {: h% v; R1 K" v
$ |% G. h# E) X0 X& W( \" htar -cvf test.tar test1.log test2.log #归档多个文件+ n0 H3 k7 B# X3 n# P; E
tar -cvf test.tar test/*  #归档test目录下所有文件" W4 w9 k. [: J$ V/ t
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 , l( T8 f. ]# T
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。' a8 w/ m, r1 e$ U( i# y% J
归档并压缩为tar.gz或tar.bz2
$ |: ]6 x7 a8 ]+ M/ q* H5 ]( l2 \4 p/ A
这种方式打包对文件进行了压缩:" z9 F& x0 w6 I- m  ?! Y) N3 t
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
* j4 D# a2 N4 z( i- Q& Jtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩; \7 q0 w$ ~# w8 ^  X  }" `
查看压缩包中的文件2 A5 [3 I5 s6 G" f# L
4 s/ G% a6 a2 Z( U# E/ w1 C. e9 s
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
, Z1 B  i# W, i9 F- H: n9 `tar -tvf test.tar #可查看test包中有哪些文件
0 i5 T! k) R$ D; w6 x7 P4 M7 D打包后删除源文件+ T2 C1 H3 o6 T7 |) Q" ?, V# B

7 d+ H! h5 e( J$ N: u# ?有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:, D, T( r5 [1 N) v4 U( i; J4 O% E
tar -zcvf test.tar.gz test.log --remove-files
! {. N3 b3 Z; G) z打包除指定目录或文件以外的文件
, Z  n1 u/ Q  N/ E4 Z' F9 E* h9 J! x/ P, ]* A& H
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:7 ^: i- g' e4 r% L. K
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件# [( q- D, N9 q: j
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
/ i: b7 d8 x4 d1 m6 {  H' e向压缩包中更新文件
! a4 f. n# `" Y, H' F  s8 f+ b
' @* C) W3 O7 n' O例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:* X( {9 n* y! D8 C! ~2 |5 n
tar -tf test.tar --add-file=test #只针对tar包3 f& P. F3 O7 ]; C
向tar包中增加文件# C- Y! v* f9 K5 D( a( n
' c, e2 C! N9 a! W. ~- ^
向tar包中增加文件可使用-r参数:
& V. J( k# x4 N1 M2 C. Vtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
$ h% h+ w+ p* D删除压缩包中的文件0 R7 q, `! ?( M- P& n8 U7 v& Q
) [! G2 X, Q# Z+ ^! q' O( p
在不解压的情况下,可使用--delete选项删除包中的文件:* P' a+ p3 }+ ]* Q' b
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
: w/ j+ L9 ~* w  Q8 d3 D7 Z解压
; }$ H& Q0 {0 K1 P
7 e  v6 d/ i/ P( K) S解压tar.gz和tar包到当前目录
  ]% l6 D5 u2 ?- Q6 M4 i$ V: L- r2 {# Z, G
tar -xvf test.tar.gz
. @/ y4 g% t. Q1 xtar -xvf test.tar
3 M- [; N; f0 D4 ]) g解压到指定目录4 i' _/ M. b' {+ Y1 r7 I1 ?
; @+ d* i9 V1 R7 F7 P
tar -xvf test.tar.gz -C dir
) @1 i$ W! s. m$ r/ D! I) htar -xvf test.tar -C dir" H0 M; _- i( z1 }7 Y2 g
解压包中指定的文件" E3 A- N* p- M
( t3 ~7 ~& h9 k4 X& B
例如test.tar.gz包中文件情况如下:4 _, v1 x# P% Z
1.txt
) f; F! B" u' c5 T) Alog/
, l$ v8 E9 c, r9 w- L- ulog/1.log& U5 A2 J, K  G
log/2.log' }) E6 G# _9 z9 [
log/2.log
4 W2 o7 L* j3 ~log/4.log  i  j# C- B. g+ K5 J+ d
log/5.log7 E9 K* W% q. x/ q) @- X
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:3 W$ O6 X+ T" F- p$ H4 o
tar -xvf test.tar.gz log/1.log5 D# Y4 n  ?0 j3 a9 S
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
7 [2 V. N/ l6 X; p9 |- R# V解压时去掉目录结构& _$ r, U( n- t: d

- c4 ~) \% O# Q+ C; o压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):+ N* N2 F: c& \
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录0 ]4 t0 j  ?: n! n
解压时不覆盖原文件0 Y# g; U! Z) B" ?2 v) J' }/ E0 I7 k
% W1 x! `7 V1 _9 l
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):5 p5 }* t9 J5 ?4 E9 j; x
tar -xvkf test.tar.gz
; Z$ L6 f% @4 m, u; B特别提醒
6 Y+ `* i0 u% S  j0 {6 _! [4 D, w2 J. |. j' [& M; q2 C1 A7 c
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
' U* p6 X$ p$ Czip/unzip: z9 H( d; C) R' S/ _3 [/ n" P

8 n+ u6 o- y+ m, |7 u! F$ Q, szip和unzip命令主要用于处理zip包。
  b/ `  u! P* p% S7 T: D4 l& A4 n压缩
9 _* `  o2 B# D: Y2 c. ]  ~# q. \9 _% G) C4 y* o( f+ K
涉及参数说明:
6 h7 z' Y( F' v6 J( b, M-d 从压缩文件内删除指定的文件。
4 ]# {6 |' J3 a5 Y! j/ l-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。) C8 {1 D( h2 m% _" B; D% h0 t
-j 只保存文件名称及其内容,而不存放任何目录名称。8 L4 g& g3 z0 q1 B8 r' r+ J
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
, k7 E8 ]5 S9 R2 r-u 更换较新的文件到压缩文件内。" ?! A. s" Q1 u: j
-v 显示指令执行过程或显示版本信息。
4 e) h9 R/ n6 e8 B& c, q-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
% h3 |& c. R; i/ `4 m- <压缩效率> 压缩效率是一个介于1-9的数值。
( Z, W+ h7 g! V6 F压缩文件
" N- I# P" F! T  p- ^
6 d% P0 O' T$ a! G/ Y6 Dzip -r test.zip test/ #打包test目录下的文件/ d) n7 h& _/ o0 h" {: h: O. M% P
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
$ {& t1 ^6 M9 T  ?% n! P( X& w指定压缩率打包文件2 h% u0 ]- j+ V/ Z1 v$ D+ I. f' p
' `" T8 F; L& p6 ^3 p5 O/ c
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长' b+ Q* S- V. T4 t8 f3 K7 r; \  X
打包符号链接文件7 y7 f4 j7 j. @6 Q# I
! T* D- ?- x+ U( h7 ?
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:* w$ z/ F2 ~0 }/ a6 V! R
zip  -ry test.zip test* y6 a8 s. K! D& g1 Q8 T. D! q
向压缩包中增加或更新文件
: V# n; ]; P( @; I4 D( ~* A& w7 A" _1 N
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:% I" E$ L4 b2 Q6 q- R# H7 Q! h$ L
zip -u test.zip test2 #向test.zip 包中增加test2文件# k* d! m" h# q, v: i* b
压缩时加密/ r: Y# a" \" _5 K4 c9 e. ~
% B/ r6 ~) t1 m* Q" ?4 I" j4 D
压缩时如果需要对压缩包进行加密,可使用-P参数:2 w6 ^! q' ?! N: P  [1 d
zip -r test.zip test1 test -P 66666 #使用密码66666加密
" K6 C; i7 s: D; g7 x- n$ k8 Y7 P删除压缩包的特定文件2 [: o( u9 Z" r, Q7 V0 V

, w1 q2 N+ Y9 i6 }zip -d test.zip test  #删除test.zip包中的test文件
. `/ a8 C* n! w- ]! W! z. a3 J解压
. Z! V# d1 _* W5 ~9 t
: W! E& H* o* {" |涉及参数说明:& q; s- C$ J6 o9 x* Y5 z. {# m7 W! R
-l 显示压缩文件内所包含的文件" {. ?) @- J4 N9 l6 m/ c7 a
-j 只保存文件名称及其内容,而不存放任何目录名称。
, S& D  o7 j/ F! ]* c* k$ i- n- s7 u-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该0 X' t% q5 F9 r+ M, W
-v 显示指令执行过程或显示版本信息。8 ~0 {7 y# d2 t1 Q. P
-d 指定解压目录,目录不存在会创建3 K( D! _, S7 E0 N$ |
查看压缩包中的文件信息: a& b8 G/ j, U+ @) V, b
1 J" u4 n3 x7 a% \, E8 n# y% B
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
5 N/ D! l+ }' Iunzip -v test.zip #查看更多信息,例如crc校验信息等+ C1 A* C0 z1 _0 U3 W# R; U
解压压缩包
4 [' G* X; ?7 x  \+ D" F; B; o" f2 Z% U3 F" L
unzip -o test.zip -d dir #讲test.zip解压到dir目录4 ]  E2 ^. n& O/ f5 o7 l# T
解压包中指定的文件  `6 B9 u# U, r( Z

0 R8 t2 w" E( n* D如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:1 E# |/ h2 |( [
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
( P4 _8 @% X* Y4 d- X- h7 Munzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件3 V# a* H1 u" f; G
解压时去掉目录结构) s: [4 u4 M. ^& z' k
( `& i1 |3 k, ^$ v9 E
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:- v6 s$ B, I& J! [
zip -oj test.zip -d ./temp  : J( w6 N; K7 z' H9 f. \
解压jar包
& m( W: |0 T) Q5 V3 I+ _, w
( ]; x& Z& B9 U: U$ I- D0 n, pjar包是java归档包,但同样可用unzip解压查看里面的文件:2 _" }/ y# t" d7 ?+ @
unzip -o java.jar -d dir/ @* U: _0 N  Q8 b- I5 V! i( E
gzip
1 |) z/ i- ?! ~% T: I' ~7 s8 ]
) [& g5 l5 H" K涉及参数说明:7 H; |, i: i- T/ G9 ?
-k 保留源文件9 n* w, X) i- n* Q1 W) k
-d 解开压缩文件% j9 F. n  W4 e/ ?; N
-r 递归处理,将指定目录下的所有文件及子目录一并处理/ i4 y2 T  h4 H
-v 显示指令执行过程3 q# \* B) ~: ^' t4 m( }" i' n
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
; ^& L( w2 X# |2 Z1 J' D: O0 _gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包( V% Y0 v% I6 K. u2 P
gzip -rkv ./* 递归压缩" L2 K' u. S; Z
解压也很简单:
* y' B; Q  T/ ^4 o/ U! pgzip -dv test.gz 2 e( I6 y9 [, Q8 Y7 C
bzip25 X  J& @* F* v8 O. ]9 c3 m

' }! A* S  r8 t$ {* Vtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
4 l1 u/ Q' F% G, \% a3 j. H) gbzip2 -zk test  #压缩test文件+ U2 W; b. b$ _7 ~, q+ y
bzip2 -dk test.bz2  #解压" |1 w/ ^/ D: a6 m+ R; ~( a. z8 _
rar/unrar) k  C  x8 `1 g6 j

9 x* k) Y7 t7 G( i3 p  grar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:5 `0 n. A9 A. M, t1 r! J' F2 F7 v+ i
rar a test.tar test  #将test文件压缩为test.tar/ e# ^/ b1 Q2 h8 R1 j1 k1 D
rar e test.rar       #解压test.tar) a0 f1 S5 D6 k5 @  M; ~
unrar x test.rar     #解压test.tar2 r" ?: v. ?# H' s- y' ^/ n! C
压缩率比较  Y8 U+ W: x. a& Z( k" T3 Y" U3 ~
( k. _$ z* t- l" @9 U$ j
压缩率一般来说:- @/ a2 D& N; f9 [
tar.bz2>tar.gz>zip>tar
' [* s# f0 v4 S5 k4 }压缩率越高,压缩以及解压的时间也就越长。" N+ a/ @5 T& q+ R9 Q, w9 q9 x7 r+ n
总结
- m- k3 P" M+ O" c; h- X" G( a3 w: l7 d
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
; ?1 ^1 ]- |, q7 R( A有任何补充或建议,欢迎留言^_^。
1 o5 m2 T( D/ H+ G, T/ W- s/ S
2 l8 q# X5 o% u# U& c3 t; E& h! P: }7 i/ d! e7 v

5 }! Y* U+ z5 H" ]0 i

( d7 l) Y& `  u: r: _

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

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

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