51fly国际课程 (51fly.win)

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

4 A+ M" I4 l$ m  u3 ~
' z% q  Q2 Y) j$ j" Y, R. v
1 R, l4 w. n7 A& [9 J* B
前言( ]: q0 P* K0 M. ?7 @" P; @* }
1 D, k8 k/ w; R6 p$ C6 j" f8 J
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
- F7 r( U- v1 \; n3 }7 ftar
. [) x" B0 U6 Y5 n8 L8 v3 l
8 ^8 v. l8 m4 _6 f5 Ztar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
1 H9 ]5 A( ?. X. {5 z0 q涉及参数说明:
, N- r$ Z/ f: M% l
-c 建立新的压缩文件( u6 y1 i; N  [% x2 Z
-r 添加文件到已经压缩的文件9 {; @$ r2 Z4 \- n
-u 添加改变了和现有的文件到已经存在的压缩文件* i+ h) E* G; N. A
-x 从压缩的文件中提取文件
$ s; t: i6 X9 y- r) C-t 显示压缩文件的内容( z0 z4 G8 X$ \. N
-z 支持gzip解压文件
+ J$ W# t6 c- ?: k& }- P" N+ q-j 支持bzip2解压文件
; p4 e( v) q1 ?-v 显示操作过程
0 k1 X0 U& g# Z3 h2 D+ C-k 保留源有文件不覆盖* }2 m9 i( e/ X& [( s9 h6 k3 ~
-C 切换到指定目录
9 {" Z% I: ?6 I8 ]-f 指定压缩文件
( z# f5 Y# T% P( i) S* \
0 s& X. o  x: R--delete            删除包中文件" l3 r& L' v; D7 L# r
--strip-components  去除目录
% {5 f( t7 c2 u; L+ y* f--add-file          向包中添加文件- q8 Q- S5 x+ A. I* E
压缩5 Q/ B, n% S: K+ N

  ^" ]5 T1 s- V* h$ T6 T' [/ O归档tar包,不压缩
+ ~% j' h9 p) }* [
' O) N+ H9 @' E  U1 Ftar -cvf test.tar test1.log test2.log #归档多个文件. J+ F2 W6 |3 @3 X! [5 Y% [
tar -cvf test.tar test/*  #归档test目录下所有文件! R! S0 o; c& y/ r4 [
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
  y3 l) G9 _# F. u+ Q由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。0 u: O' Q$ k) o' _# ?4 |
归档并压缩为tar.gz或tar.bz2
5 z: N" G1 I9 O5 B# g7 z+ u
* t; g  L2 i" ]这种方式打包对文件进行了压缩:
. _1 j3 a: W, Gtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
2 h$ g, r# n, X7 _" Z; Rtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩0 C. P& ^6 i! j
查看压缩包中的文件2 j' ?+ ?* D' G8 c; g1 Z. o

! y. P, i6 O  }2 b如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
* r5 d+ |: v' X: s- e$ E/ X0 J6 |tar -tvf test.tar #可查看test包中有哪些文件
# \4 ~/ D1 }* e5 f  E1 N打包后删除源文件
) R( k& E, _4 n' [
8 E+ V' F3 n+ S2 p2 o' t9 x2 E$ G有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:$ P& h  f' c- P9 p& v- m7 L" K8 R
tar -zcvf test.tar.gz test.log --remove-files 8 p( z9 N3 u/ ?
打包除指定目录或文件以外的文件
" n/ F& h+ h# b& o
2 c- a' v( }1 M( _对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:  [- G+ e# p3 ]4 F& G8 {+ B
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件4 S' |; \& j9 I
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
; h9 p! u3 f# F" P7 N* o5 x向压缩包中更新文件
# M9 E  V. I' ^8 R. v: G# S- v+ c- B( ^% H* f0 s' F7 T) V! o
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
4 t8 b, U: L2 m0 r  P5 O! |" |tar -tf test.tar --add-file=test #只针对tar包1 d. b. A% Q/ ?1 S. r' f) Y
向tar包中增加文件, n: s0 X. L+ y. D- e+ I
$ n4 _: E0 B& |3 q3 P0 A
向tar包中增加文件可使用-r参数:
" R! w9 G2 S  z4 y( x! htar -rf test.tar testfile #在test.tar包中增加文件,只针对tar+ H6 @2 `0 |1 s5 O& j6 c
删除压缩包中的文件
( w/ A% H" {) I" ^* [- D. T) w1 M
9 O) q- S# E. G+ u- j在不解压的情况下,可使用--delete选项删除包中的文件:3 |) A* {/ X% L! L& b
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
" Z# E$ i) J* G  c7 l0 V% e  \3 V* R解压
% L& N# P( g7 j' k) `1 X5 `( ?6 T1 ]- i
解压tar.gz和tar包到当前目录; G9 C7 E; h4 d/ s

3 b/ c3 F4 ]! D3 S  ntar -xvf test.tar.gz. B: W+ {* g1 k- G' |! d, Y7 s
tar -xvf test.tar
# c: A8 \- k# ]解压到指定目录
( W* u' o; q3 e3 m/ }4 T7 c# V# U5 v2 T
tar -xvf test.tar.gz -C dir4 _6 ^/ f! y: f- x* M2 T- i
tar -xvf test.tar -C dir
+ i# _( I% e; t2 W) r- i* Y4 X. S解压包中指定的文件
6 ?! [0 r; j4 _# c( c8 `' R1 b9 H' J5 X, y8 b6 L5 v7 P" H! z
例如test.tar.gz包中文件情况如下:
; _( |! L; N4 A( A9 Y1.txt
9 D, Z% b' d. A4 Y" _log/
8 T& d$ P6 v, N6 S* nlog/1.log
6 {) W2 v8 `# Rlog/2.log/ k* A& u  S1 v
log/2.log
# W- C, U% Q7 D9 t0 F7 l( V: Rlog/4.log3 g# e3 X3 O, {2 v5 z( H: e  N
log/5.log
3 A8 w8 S, e8 u; _1 {& @, [& Q如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:( g8 z; Q  @# v- U# x1 k! D$ C: {: E
tar -xvf test.tar.gz log/1.log/ X# r1 C/ R' H- Z* G
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
$ F5 g$ G. W( B/ [1 ]. ~3 P2 i" ]解压时去掉目录结构
6 u2 v. l( O; b# o* c! L9 O1 q) [4 h, E/ Q5 O: P; `+ ~
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
; D6 e, T, p7 Z9 [tar -xvf test.tar.gz --strip-components=1 #去掉一层目录$ x( @( z9 i1 d
解压时不覆盖原文件
1 E+ y7 ~, m: c0 y5 R% _& z
4 K" }8 d3 `- }% k# ]$ z: y当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
7 E- `+ M3 n! H0 u' X" `# ztar -xvkf test.tar.gz2 Q+ M( z! K! c
特别提醒
+ V. B& y( ?! ~9 i7 y) ?, I8 n
4 i/ ]; N7 m/ b9 L前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。0 e3 g. t2 |' k+ `  L' f
zip/unzip
& N. p  |, h3 n3 a6 O% g0 V" Y: V( b7 `  t+ i0 u6 E
zip和unzip命令主要用于处理zip包。
5 e' g/ ^- \' Z! \, O压缩8 y9 c# V" b/ |

. M* R3 ?* M# o9 a# b0 p' P涉及参数说明:
$ l' R. c2 C, V- H; ^7 j3 j-d 从压缩文件内删除指定的文件。
0 U2 _' G! l/ q-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。3 X. [) }* h* a; v* l0 l
-j 只保存文件名称及其内容,而不存放任何目录名称。& }, @  c6 A) h0 \) ?% E! ?4 x$ p) T
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
1 e8 H" A9 Z# T; u: s4 e1 x9 h8 ~-u 更换较新的文件到压缩文件内。
- W* e5 F. f5 w* Q2 o, }-v 显示指令执行过程或显示版本信息。
0 [$ p8 j9 B1 w( @) _! W-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
# ~8 x( q% g) i6 M  ]: o- <压缩效率> 压缩效率是一个介于1-9的数值。4 i5 q) e8 s0 N, x" T% _1 J
压缩文件
2 T3 E, E$ R$ e! Z7 S5 k
3 i! N& y( J# T' Y) ~5 czip -r test.zip test/ #打包test目录下的文件
4 u2 N3 W0 j! g+ p1 a4 g1 u* {& Czip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
. W/ u/ H4 ?5 Z指定压缩率打包文件
  t7 u/ B. y; p- a, K: i: x. `: g; w5 k6 `/ g, ~+ B/ ^1 Y
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长- O5 ]6 ~2 s, p8 S4 C* U' ~7 i
打包符号链接文件- R! k. g- M6 f# [% }7 r* g
. Q7 r* d' {# ^, p4 [
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
! R5 X) K6 p" r1 w, |: Nzip  -ry test.zip test
2 ~" U+ n) a! Y* F1 o向压缩包中增加或更新文件+ L. R8 j2 B- \# {4 y

% h7 ]! i1 N6 }+ u有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
0 K' N" a# |7 h3 [: f; yzip -u test.zip test2 #向test.zip 包中增加test2文件
6 {: T7 M6 v# Q压缩时加密
# x. c. x# @0 S& w/ P3 |% w0 M, U$ L0 n" V& y& s
压缩时如果需要对压缩包进行加密,可使用-P参数:/ m# t' `7 C  k
zip -r test.zip test1 test -P 66666 #使用密码66666加密2 I  Z5 N* P+ Q. k, ]( O- m
删除压缩包的特定文件
" U- N  O& @6 b+ x6 g! z& S4 _' ?) O2 }. l7 U% z0 j
zip -d test.zip test  #删除test.zip包中的test文件
4 z1 O  ?" _3 ^$ n* p  c解压
) R+ q& U' f2 A6 L2 z2 ]* ]- D. p  p$ h+ }9 j% ]' o
涉及参数说明:
) `# m4 a, l% P! G, [5 d8 ?  e-l 显示压缩文件内所包含的文件7 j0 s1 X5 G2 V
-j 只保存文件名称及其内容,而不存放任何目录名称。
4 f7 v" a! X) `8 `# O6 T-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
8 E  a: j8 v  X5 b3 q9 a-v 显示指令执行过程或显示版本信息。
" C6 Q* f  @) d+ O* A# X9 |-d 指定解压目录,目录不存在会创建7 o0 J8 Y3 b6 }. D9 F
查看压缩包中的文件信息, m; X! o6 l' S4 h3 S. r

- N8 h+ v/ N# b; P- Cunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
3 x- s, m) @" D. k9 y8 dunzip -v test.zip #查看更多信息,例如crc校验信息等$ O  X2 s( Q; j/ y, X/ R& f" H
解压压缩包
& i# g7 N3 }# V& T7 }+ k; V
1 q7 A" |. Y- C- |3 F# Junzip -o test.zip -d dir #讲test.zip解压到dir目录
2 t0 `5 O4 b! q# c, P' y7 q) ]0 R解压包中指定的文件& `0 j6 P, b+ u- H1 c
: N7 ]) v5 p3 F& f% z$ }
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
! t4 x3 o& e) T3 c/ v) [unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录0 `  M2 d. B' N+ A
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
" e0 [1 r: B/ B: c1 M3 ?+ p* L, _$ Z解压时去掉目录结构2 I. m0 N/ F9 u

! d+ l5 i- e6 X4 o7 k5 Y压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:! g1 _) j' _1 O7 E& A
zip -oj test.zip -d ./temp  
& G2 ~+ z/ a. S( c( j解压jar包
( ~, j$ d% K) p2 {# l3 V% f
" O$ D  Z- D6 s; p. Rjar包是java归档包,但同样可用unzip解压查看里面的文件:& d% Q( q' y1 @( b2 d3 w. b
unzip -o java.jar -d dir; X3 B# f; T& t8 u2 m2 W- B& d- ]
gzip% o; {, }; A) L, x! c8 s7 h

% v( n( k7 p; b4 f% Q) ]1 ?: n涉及参数说明:4 x% E4 ?; w# }  f' [0 `
-k 保留源文件* \' C" f/ l5 d* N+ e* k& P
-d 解开压缩文件
& R, M& d9 H! ~+ `' p' L-r 递归处理,将指定目录下的所有文件及子目录一并处理9 z  {( h2 H- ?
-v 显示指令执行过程
( S/ c, L3 d7 Z, E6 v3 m2 P2 C2 mtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:* X8 G# c& f" v# a+ s: k  Z1 q9 o
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包" i$ d$ B1 p0 ?- A) ]- B
gzip -rkv ./* 递归压缩
' O& d- B; m- q, R# l0 g7 B解压也很简单:- J* c0 ~, z  s* i( Q/ V3 m, `5 J
gzip -dv test.gz
$ p* K% u' B( Q  z8 [5 Ybzip2- H+ C5 C1 W! J, ~# m

. i; l6 v/ z3 Y8 J; @' o+ ftar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
- ?  L3 }( y+ Fbzip2 -zk test  #压缩test文件' r; M7 D, ~# v# r# u+ l4 b5 P. I
bzip2 -dk test.bz2  #解压
& u  q; ~% x7 o  i) ?2 j% w4 G0 ?/ Srar/unrar
9 K+ A8 v* l, Z7 Z& H2 j0 e6 F) i% h
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:7 m! K6 f# d( A" d+ h# X/ ]8 P
rar a test.tar test  #将test文件压缩为test.tar* m, `$ g, M2 I% o. K
rar e test.rar       #解压test.tar
; W% m* P, i( X; R: u7 S) I  [unrar x test.rar     #解压test.tar
1 ^$ X+ h4 k( [1 j压缩率比较
3 W( `% N, Y( e' M  C
! y# n3 a8 j5 M. x: a$ s3 F" K压缩率一般来说:
! h& n: I2 T. d% ntar.bz2>tar.gz>zip>tar! `% o) K. o9 {4 Y6 q
压缩率越高,压缩以及解压的时间也就越长。/ x, V- l( K# l3 `
总结/ S; {4 L0 E/ S4 C6 ~6 q) C
7 }" t6 ?, {4 ?. j- y
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
0 g+ k8 _) x$ s* u. Y3 g有任何补充或建议,欢迎留言^_^。
5 [" B+ p9 e) ~! i" s( z, f- i
9 m8 x& B) _# v4 W* k$ i8 t6 P( p0 T
; [$ P6 B/ T$ G! ]  Z* B7 u1 b! v
2 X5 x" y5 ]1 S0 t

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

浏览记录|手机版视频|手机版试卷|使用帮助|51fly国际课程 (https://51fly.win)

GMT+8, 2025-12-20 01:32 , Processed in 0.043816 second(s), 32 queries , Redis On.

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