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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
4 ?- }4 t7 E$ a7 [/ w. K2 F& @) L: Q
5 n) `% q4 E  P

! o- p" a; q4 W3 q/ f3 ]前言1 p' @/ r* B5 S2 @% f

$ \! U: a, W) {+ e  P9 P5 S3 k6 H+ aLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。9 K! ?( H3 P3 j/ @9 J' x% h. C) J
tar) u9 I: i' ~8 ~7 B

/ j1 @% b, M7 j* ~: [4 Z! w" \tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
3 U. g5 O2 b9 a1 e涉及参数说明:
' Q! ~$ G4 P2 E) ]' H( f+ w% K
-c 建立新的压缩文件9 n& w$ a- a8 j/ N
-r 添加文件到已经压缩的文件# [9 f+ B' u+ B" y( N6 K5 M" o
-u 添加改变了和现有的文件到已经存在的压缩文件
% S' D& c1 k# P, V-x 从压缩的文件中提取文件
4 R' P3 s( |. ]2 d" V7 j# X0 s-t 显示压缩文件的内容
6 x: L8 {7 f* Y0 g- P-z 支持gzip解压文件! \& _) c2 y. @9 a8 c- T  A
-j 支持bzip2解压文件
) q9 X' V* x; X-v 显示操作过程! H+ j, I4 Q8 v' f
-k 保留源有文件不覆盖3 K" ?1 Z( S9 K6 [8 D9 y
-C 切换到指定目录$ n. k: H* o4 z. i1 s
-f 指定压缩文件0 m8 }! H" ^0 {$ F5 g# S

3 l4 K  R3 f/ J( j, v# B* T& W--delete            删除包中文件+ f0 I% t/ X7 u+ i9 v1 S' G
--strip-components  去除目录; n  F( s, T3 j% M' }7 T
--add-file          向包中添加文件: U& `- j8 J, ^8 W  i
压缩
0 U8 G" r* h# I* C, C; N
4 d) r- d5 @' \/ y% j* D2 d3 B2 F归档tar包,不压缩
  T5 M, l) i! t8 [+ J# B7 h; m0 U; e1 E
tar -cvf test.tar test1.log test2.log #归档多个文件. a$ F2 ]. H3 }! K9 C8 n# y8 y* b9 t
tar -cvf test.tar test/*  #归档test目录下所有文件& p5 m& I7 C( H* w
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 2 }/ l, Q: V! ~
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。& w) R! p9 K# d' d0 r! A
归档并压缩为tar.gz或tar.bz2/ X2 J- Z" `5 R; J( s0 d
3 A0 v& d$ }) A/ d& o- l
这种方式打包对文件进行了压缩:8 M6 {0 q' x' ~0 F& G3 P; N" Z6 x
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩9 f6 I  M) b9 }! ]/ \% ?$ ^
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩2 F3 S8 ~' Y+ }; R6 W9 t, |4 u$ S* M
查看压缩包中的文件
* U$ t. X3 g( L' N* L5 o* ?5 m, e+ w5 }, k& ^
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
, b" @+ ?. H5 w: Q/ a4 utar -tvf test.tar #可查看test包中有哪些文件
6 E# J, G  t0 G6 F0 T打包后删除源文件( d& P$ f: F8 Q3 R, S6 o
; @$ V9 M9 D# l' h3 P+ r& l( z
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
' R; g5 Q' ~- A' U7 ~$ [% `tar -zcvf test.tar.gz test.log --remove-files
  }: D& |6 ?- ?- a) o* j打包除指定目录或文件以外的文件( G& W& |" R7 L6 ^9 G/ g
1 o+ {+ L) l/ |# S1 Y( k/ F
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:2 M0 F6 {1 E! w7 h( g6 J
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
6 F. F$ H0 ]9 `- r7 N这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。1 l( h& e" [5 ^( r: V& \
向压缩包中更新文件4 r  i2 H/ W" L+ E. z
- p7 u0 E  Z$ l8 x- M: s
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
% z1 v  f. Z, \( E2 ^5 G6 `) Utar -tf test.tar --add-file=test #只针对tar包3 O: J- R6 z. ?
向tar包中增加文件- a/ ?* U; i1 M+ n! V: t
9 d& ~; d( j" o3 ?
向tar包中增加文件可使用-r参数:" J1 i0 g2 o) X" y/ m9 W
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar  v& Z0 {4 W, `
删除压缩包中的文件, I$ T4 K4 d  Q) Z: _7 `5 e, N

5 n2 O4 q+ S/ |1 b$ s) j在不解压的情况下,可使用--delete选项删除包中的文件:
) `& f* j+ Y* Y+ |- o  qtar --delete -f test.tar  test1 #从test.tar中删除test1文件3 v5 n. r9 A- G/ h
解压
5 X% Y0 f4 d; m5 Z
) t" S; R2 H6 S解压tar.gz和tar包到当前目录
& h7 v3 v& z4 x9 G. L! Z1 f  j* m5 i; ~( x' T$ ?& t) b; u4 s0 ^
tar -xvf test.tar.gz
& G5 R9 `9 h+ m( C# F1 @5 a/ Atar -xvf test.tar
( W1 Q7 V2 `( h8 e' E7 M解压到指定目录
- V5 g8 B: X1 h: k0 O+ k& Y/ E. ]8 {1 G4 A  W
tar -xvf test.tar.gz -C dir
) M; [0 V9 d; l2 m1 ^  Ptar -xvf test.tar -C dir
; B& u  B! n' z$ h$ B" _- H解压包中指定的文件, f8 Q$ w* E, @

2 h. s, i: W) v' @+ B: u+ R例如test.tar.gz包中文件情况如下:
% }0 D6 i/ }* g- w1.txt
! V1 ?6 ]! w3 [0 elog/% n; w$ ~  w2 h3 i+ @  _
log/1.log
( [, @1 g8 u; c7 `3 \% _, z& [8 Dlog/2.log
2 x, M$ k1 G/ ?6 p2 b7 Klog/2.log
! M  z/ W% A: N% a. Y% e$ nlog/4.log7 s; p7 ]! d$ j* ~
log/5.log
8 ?9 I% d- v' Q2 y: L$ S. ?如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:/ L" o* ]8 l* k" q4 L( c+ @
tar -xvf test.tar.gz log/1.log3 ]' ^% S( R4 `' Q. E% h) n, r
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录. f* _5 [, O8 Y0 \  v3 I
解压时去掉目录结构8 l7 O# P9 S2 J- Q

1 {  ?7 C- z. Q/ m, U* N$ w压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
/ m7 ^7 j/ q9 Z% f  @! etar -xvf test.tar.gz --strip-components=1 #去掉一层目录4 m3 }. S& u! G; l6 T0 v  Y
解压时不覆盖原文件) L( u' Q' S) f
9 v/ b3 t! G+ p: N5 Z/ Q; w0 G
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
$ X, p9 p0 F% U$ n" z2 xtar -xvkf test.tar.gz; H. V4 q* a7 B! b; t$ M
特别提醒# Y5 j; t8 k5 V; L$ Z' Q
# H: c  U* L- ?* m% U
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
4 W- g$ c; g8 C4 K# ]zip/unzip
, W& c" ^# H1 n/ |: O
$ F0 M( H# H# _6 N3 s0 e% @) \5 Jzip和unzip命令主要用于处理zip包。6 A1 K5 ?0 h  h) T/ ?
压缩7 c' C& q9 M  O; v
+ ^# @8 K$ d; O  k8 k
涉及参数说明:) Q4 G- t) M% K" X, t3 L
-d 从压缩文件内删除指定的文件。
' e: w4 D2 V  x0 J1 ~5 \-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。3 n5 @7 S$ }. ^  T7 h  B( S7 G
-j 只保存文件名称及其内容,而不存放任何目录名称。
( R9 P% ~5 b; ~6 \7 p! s-r 递归处理,将指定目录下的所有文件和子目录一并处理。
0 D9 Q# r; J8 T( p6 f0 c2 X-u 更换较新的文件到压缩文件内。
/ Z8 k8 z9 \2 }, m-v 显示指令执行过程或显示版本信息。
. ^4 s2 T, G( m/ a% N0 g-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。- ~, [) f4 _- _9 G# }
- <压缩效率> 压缩效率是一个介于1-9的数值。( ?) [7 k; r) Y
压缩文件
1 l1 P1 z3 n6 L. p+ i- i
$ h7 d8 q( y2 ?* z3 L1 N. x, lzip -r test.zip test/ #打包test目录下的文件
- t" [2 j+ n" X$ {. _# V7 K% f9 Izip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
1 {% I- V! V5 a( A- \7 j  r指定压缩率打包文件4 l+ d6 J2 F! |) ]1 v% n( i  t
% G- W3 P  ?  A9 I  M7 N
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长0 N1 f' E* q# ?% M6 b  i5 s
打包符号链接文件
5 y: x4 n1 e/ o. d7 O+ N9 s% W9 L; i/ C* X
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:% z9 ^& ~. L2 v* Z4 Q3 B
zip  -ry test.zip test
7 o: j) s" o" s向压缩包中增加或更新文件
) N. F/ I5 x# z+ O5 g, d
* J, z. L2 a$ G有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:7 N  l7 h8 `9 P7 g8 ~1 R1 i
zip -u test.zip test2 #向test.zip 包中增加test2文件
: f2 R: ]" }& h6 ^$ K压缩时加密
* t4 b! [) v1 l8 k1 H% l
1 D# f2 w% T% q" ?& d9 I压缩时如果需要对压缩包进行加密,可使用-P参数:
: A! a1 R) t* f+ v; fzip -r test.zip test1 test -P 66666 #使用密码66666加密
7 S6 u, U8 T, c1 f删除压缩包的特定文件5 ?$ j! c9 u: L; X
9 B1 g/ O. P- Y: |' V1 m5 v
zip -d test.zip test  #删除test.zip包中的test文件/ z9 w4 q2 L3 X' Q# H! W
解压5 t) l6 @- Z) \  S+ Y( m* R
3 J) g0 ?. X: x! I
涉及参数说明:! z4 [; `9 u+ j" z
-l 显示压缩文件内所包含的文件
! H4 ^( y* i3 Z9 i, ?# l# T-j 只保存文件名称及其内容,而不存放任何目录名称。
& I4 p, ?# ]0 z8 [% Q( _-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该( @7 T+ Q* l; V: S, n5 v0 ~! i
-v 显示指令执行过程或显示版本信息。
" a: [% U. L5 t4 K& r0 ?6 P-d 指定解压目录,目录不存在会创建' Q5 ]/ b8 f/ W
查看压缩包中的文件信息
5 s" r& D* ?3 ~+ ?1 Z! w) r( w
, c& c2 @% z) gunzip -l test.zip #可以看到压缩包中的文件名,日期等信息' K' L0 L: F9 z# t
unzip -v test.zip #查看更多信息,例如crc校验信息等; D. |# S, o: d' A% s
解压压缩包
3 z% m- z9 F, r# Q  ]6 g/ k8 d( v
. [' u9 v3 `, ~. L7 j3 Xunzip -o test.zip -d dir #讲test.zip解压到dir目录$ |' G9 h; J- E# B; d. _
解压包中指定的文件6 s3 D! U/ N( E7 W. t
, F* f) P$ T2 k# o5 n6 i& N
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
: K& p" V: R. ?unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
# t9 y& a* g! H7 z7 q0 S' M9 munzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
2 g! M: C4 x" K1 X* M2 T* f解压时去掉目录结构* {% y$ W3 Y4 M& c( J) ]1 Y" V* F2 m

2 p) w' Z5 o" q9 |* u4 n+ @9 _, t- m压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:" d- Q, ~2 L* j) F  x
zip -oj test.zip -d ./temp  % e: c. t/ [1 l0 @  l5 a+ L% y
解压jar包
/ D3 \7 z% _8 j7 Z" A7 Q: H0 l) a, C8 c, P
jar包是java归档包,但同样可用unzip解压查看里面的文件:3 o) p, L8 V" b+ V% ]- `. X! f
unzip -o java.jar -d dir
9 ?+ w" z. l- X3 y; M$ P( S% Ygzip' F! G. B6 Y% H+ N) g3 F4 L, G8 n
) A- Y8 T3 K1 v) k
涉及参数说明:
  \0 K4 `7 Y( N3 M. P-k 保留源文件
- d/ ~& d6 ]! C' P! ?( O-d 解开压缩文件
) P! m; p- M  [: E  \-r 递归处理,将指定目录下的所有文件及子目录一并处理' I* m, v. K+ f: j# j  Q; Q: ]% t& l
-v 显示指令执行过程+ w* v& o2 g# x4 ?% ]' @4 F
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:7 {) e: s  F$ R6 u6 D. }; o
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包) ^4 t( W4 P9 \! J7 p6 Z3 Q& Q. E
gzip -rkv ./* 递归压缩6 D% i# y% p! ]7 ~2 _6 h
解压也很简单:
' A1 G2 K" k+ C1 B/ Igzip -dv test.gz * I, P4 x& t- G& ]- F  ~* h0 u
bzip2
: ?8 s- _6 _! a! H$ G) t
  D6 X- H, s* }4 ?5 z' H9 u4 O( \tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:  c( X3 l1 B7 \
bzip2 -zk test  #压缩test文件
7 r& L1 b% U% d, Zbzip2 -dk test.bz2  #解压* q+ Q& @6 g* l& y. @$ l
rar/unrar
, @1 {7 B/ G2 D9 u- e0 }) P
5 _: Y8 V! j6 W% z. srar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:' h. z: [3 y# D) D. P) M0 x, |
rar a test.tar test  #将test文件压缩为test.tar
. Q& k2 ]" v' F' Crar e test.rar       #解压test.tar& l# Z* n. }- g8 p$ d2 m- _
unrar x test.rar     #解压test.tar
2 z# [2 y" P0 U1 f( x0 }) k) a# F压缩率比较
1 s; D9 m$ G* \, n- w7 @
3 b# |" |+ K; |" k1 e压缩率一般来说:
. k0 L- f( y- x0 Y7 t6 Ptar.bz2>tar.gz>zip>tar) t8 _' D9 Y6 Q" Y
压缩率越高,压缩以及解压的时间也就越长。% j4 Z6 O9 [- t, V
总结
9 k5 [# |. y3 J0 J% @0 y+ H7 @5 W& y+ p7 k2 e
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
0 g) y" u3 d$ l% B. R: p8 r有任何补充或建议,欢迎留言^_^。1 P; e4 M: e8 h# q- _
9 o- s2 k) x1 z- b% |4 t3 b; A( N

% `, L2 @) Y& I$ B
/ y" |- `- `1 g4 c: A

, a) J  ^$ C2 H$ ?

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 02:24 , Processed in 0.064369 second(s), 36 queries , Redis On.

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