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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
" m2 ?7 f7 p) k1 j0 s( c

, M0 O! Q: S# B, B7 g) [

7 A! a" T. \- A8 H7 R前言
# }+ g. {1 [4 L# d+ i1 P9 L( N* [3 h- Q4 T2 }( L+ e# q5 D; N
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
% d# a9 {; i- M- Etar
5 E& S, |( r' p  N7 ?8 n) r1 O) P3 Y$ U# c- ?! J4 i# h& O
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
+ _& [" m9 n0 O/ f- X; X涉及参数说明:

& v' h  b7 ?! F7 k7 G-c 建立新的压缩文件
3 o4 n, m& q2 ?7 P7 t3 d( j-r 添加文件到已经压缩的文件
+ k  \) s1 |/ V# S6 n! h-u 添加改变了和现有的文件到已经存在的压缩文件1 K% ~2 R. W) I( a! [: L7 a3 `5 @
-x 从压缩的文件中提取文件3 W; @: m. G3 b5 s4 w8 o5 g3 x
-t 显示压缩文件的内容
; `8 Z% }! z  {4 ]" ?: @6 M-z 支持gzip解压文件) K' Q" x5 `" R& E" g
-j 支持bzip2解压文件
; ^4 }2 ~) p& w9 l) ~+ T-v 显示操作过程4 m* P4 @0 E. T+ O; N0 L
-k 保留源有文件不覆盖
- k! y+ @- {& J1 _% a/ D8 [-C 切换到指定目录
" K1 Q& Q& }% N3 r, e; q8 R-f 指定压缩文件3 o& P) J+ ?5 W: H4 E7 b9 a

, G8 d0 R) c* @1 i--delete            删除包中文件
- h# }2 V( n$ L* p8 G2 ^$ Z( d# R--strip-components  去除目录# t) E, F6 S6 Y2 F' q
--add-file          向包中添加文件  T; a2 R( T0 O9 X1 y# m1 v
压缩9 m, v4 f0 M4 ]* h% Q; x; C
. F- ?* D. T* a. V, n
归档tar包,不压缩
6 c) @3 @3 e$ F1 G0 l, S- e2 O3 f( U; j. P
tar -cvf test.tar test1.log test2.log #归档多个文件( b& Y: E2 r7 G9 e9 G
tar -cvf test.tar test/*  #归档test目录下所有文件, U7 J( l. E1 k) z: X2 L
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
  n; D8 M+ B2 ~- Q由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
, l! Q6 E+ w0 e' V归档并压缩为tar.gz或tar.bz2/ X0 m# i; R3 `9 w# ?
( t5 |- N8 t* s+ e) R; E0 n( l
这种方式打包对文件进行了压缩:5 t! u3 {1 k* ?- v
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩9 {0 o# G/ l: p
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
: T4 ~& \. R. H1 r! n9 Z查看压缩包中的文件4 A6 B* G/ H. i7 [( q
: Q6 n0 I4 q# E0 Z% n( w& y
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
9 V9 Q8 m+ u  m7 M5 ^tar -tvf test.tar #可查看test包中有哪些文件
/ X5 g$ F9 i2 ~8 S打包后删除源文件
+ C' Q) N; X4 @1 s4 }! \+ {# N/ U' F9 P' e0 i% J
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
# J  G$ I+ [" V5 Qtar -zcvf test.tar.gz test.log --remove-files
  A- c) H, a0 f0 R9 ^" [打包除指定目录或文件以外的文件
5 ^5 q1 ?, R8 _" I
9 X! N9 X+ I, c5 u' o" |" w对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:7 u) _" U4 Q' ^  K+ l* ~
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
5 p  x+ `! H4 I! y4 A$ e7 C$ z这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。6 t& T- s) D; y$ o
向压缩包中更新文件8 L5 K5 \2 ~0 c) n( u3 l

# h; q9 H! q, f) h3 i# H% Y4 p7 K- L例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
- b7 L* h+ i$ K' U; f  q& A0 ntar -tf test.tar --add-file=test #只针对tar包
6 m7 z; T1 b/ B向tar包中增加文件
8 G$ d. X+ w2 W1 y5 V- u  u: H' Z( B! b6 Y
向tar包中增加文件可使用-r参数:$ l" b* s! D; h: |& D) L4 _
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
7 k% O0 T/ k9 A  X0 \删除压缩包中的文件
& }6 V6 ~1 [& p9 i  |. j+ `3 {: Z
在不解压的情况下,可使用--delete选项删除包中的文件:1 {" y; g2 n& X" A/ M4 {4 ~2 X6 r( M
tar --delete -f test.tar  test1 #从test.tar中删除test1文件/ j3 u) x% F/ O5 E9 q8 G
解压6 |+ z& k( {+ e" `

/ N9 Y8 G( K( H) L4 i1 [" V& n解压tar.gz和tar包到当前目录
" Y( t; p/ N" @$ f- N/ j9 x8 p
" g; \& I* l$ n! w% L- gtar -xvf test.tar.gz
6 j4 F$ M1 f8 htar -xvf test.tar * \5 |) Y$ m8 B; Y
解压到指定目录/ Y  P' ~$ X! }( S
1 D" `+ c+ J$ s2 ~: K% }: B
tar -xvf test.tar.gz -C dir
8 @. I, Y0 H* g* f0 ntar -xvf test.tar -C dir
6 o( C. E: R) c5 s解压包中指定的文件  q4 M4 b# C1 C+ ]/ X7 [
9 u% v" e$ M. q4 ]& `+ ?0 R5 _
例如test.tar.gz包中文件情况如下:  k, e8 {: r  m; G1 v' @
1.txt
# B0 a5 w) O. u! t: }log/
* d* z8 B$ D& U$ f3 E7 ilog/1.log
( @* s/ N1 Q8 X: w  alog/2.log6 t- f8 @5 d7 d9 F3 Z1 j2 T
log/2.log& R- ?& ?% N$ u
log/4.log
" [2 H: i) A! B, Wlog/5.log' }4 a  p" t' r# H) n- t4 @- F
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
: Z% P: A! R9 jtar -xvf test.tar.gz log/1.log
2 Y4 Z6 g& z- W1 `tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
* w# {" A" F" k- `: e" Q+ D7 s解压时去掉目录结构
0 q6 }  }1 y9 g# Y
; T9 `( T# @( v) c压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):& `$ d- h6 w  x9 D
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
& ]2 X0 T) }" l6 A解压时不覆盖原文件
; L& P) Q5 n4 U
( v* e# h1 |/ D" p2 Y$ V6 l当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
6 Q7 ]" q5 t8 H4 e. J3 G2 e: j8 {tar -xvkf test.tar.gz4 e' ~! G: B! p; `1 y
特别提醒) ]* N7 Q" d8 w" A4 m

& D: |' F1 n! y& u( [4 s前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。& ]& r- J# p2 t
zip/unzip1 ~0 f9 a  X$ O% o1 f% _. B" }) R
, q: ~- v5 L" T+ d# f; ~1 N. S) f
zip和unzip命令主要用于处理zip包。2 E  z0 P: {" o* d9 o0 q0 a
压缩) s& A1 r( z; Y. x7 F7 a

" o0 w6 q) r9 F5 v% I: g: e涉及参数说明:2 X; @2 D" q! y. a. F5 g; ^" a
-d 从压缩文件内删除指定的文件。
: t4 O: v5 L# X& P-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。7 \, m4 `) g( x: f
-j 只保存文件名称及其内容,而不存放任何目录名称。
* Z1 u- L: [% A-r 递归处理,将指定目录下的所有文件和子目录一并处理。3 n; \$ a* ~3 r" a5 i. ~6 _
-u 更换较新的文件到压缩文件内。" u1 k7 g3 O* k$ }9 {8 `/ Z
-v 显示指令执行过程或显示版本信息。& ]( a( C* M! P" |  I
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。6 ^9 p3 c; [% ^, O" z1 h
- <压缩效率> 压缩效率是一个介于1-9的数值。; w+ [' L& @4 N7 u7 n+ w/ W
压缩文件+ r. _  i  u4 z. u2 S
" Z4 _; j+ y, n: M* o! ~5 o! Y
zip -r test.zip test/ #打包test目录下的文件
. f% h9 R, K9 v* E6 lzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
7 b' T/ t: G- s9 p" P' V$ y指定压缩率打包文件! P0 `1 ?8 v+ T; ]* e0 ]

; [2 m. Y# t5 g% nzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
  i. H. f+ W3 c$ y# Y打包符号链接文件) b0 c* ^; m+ N% ~2 X4 p( U

5 l/ x; B2 A: Y; o  G前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
7 m/ t) z  }! g. h  V4 izip  -ry test.zip test
$ \8 L( X) P+ f9 R# |" R/ A向压缩包中增加或更新文件1 g: U5 s0 g( U- C

8 A. t( m; M9 P6 d+ X7 ?- W有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:( y& ^9 _/ I5 W1 F
zip -u test.zip test2 #向test.zip 包中增加test2文件
/ A) [( ]4 z8 N) i压缩时加密
7 H. a! b2 L# Z& i
: }% M; S& o! D& X3 F( l7 t压缩时如果需要对压缩包进行加密,可使用-P参数:4 [9 [; z4 M  D6 T. M$ Z2 l! d  }
zip -r test.zip test1 test -P 66666 #使用密码66666加密. _, S) Q5 R: H) ?' j2 ^9 U
删除压缩包的特定文件
# ?$ N# M7 _8 B- t* n4 k5 t1 w, {3 l$ ^
zip -d test.zip test  #删除test.zip包中的test文件7 i& `1 X5 w& x, j+ J! P9 K
解压
% l, e  I. k- E/ t4 |& g* P$ H) E& S' v4 U
涉及参数说明:: i6 C# T% K- P% @* m8 o
-l 显示压缩文件内所包含的文件
6 m% Y3 b7 g, E7 P-j 只保存文件名称及其内容,而不存放任何目录名称。
4 S) ?- o. m7 l5 @-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该& Z6 }: K1 B2 A0 c! |  V5 J  m/ a
-v 显示指令执行过程或显示版本信息。
4 D9 {: \0 M2 X, n* S* p-d 指定解压目录,目录不存在会创建8 w/ p( s0 V. Y3 Y- v& s8 m$ {% J% {
查看压缩包中的文件信息' I2 s5 {; H: j, v+ @6 b9 Q
. u: P2 p- f, t# d4 ^2 x, ?
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息; \4 y- y: h# V6 s
unzip -v test.zip #查看更多信息,例如crc校验信息等$ J, R, w2 s: E  ?1 f+ j; ~* u; R
解压压缩包; p0 y( I; v7 r) b! h8 `
5 K0 y+ Q" |4 C
unzip -o test.zip -d dir #讲test.zip解压到dir目录& r0 ~# z* N7 e; ~
解压包中指定的文件
9 t. I4 ~" B( u) v" Y6 Z
3 u+ p2 _7 U( w, m4 ?5 T( w. ?' \如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
) \$ T* \4 ]9 u! Uunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
& b8 k# Y) u, h: U4 [unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
  O; t6 P& u" J3 d) g解压时去掉目录结构2 `5 d) K* c; j9 y& W

7 L' e/ [! M2 V# v压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
% [' q4 ~2 Z. M% \7 p  _2 O5 a' Lzip -oj test.zip -d ./temp  
7 l; M: q; s; J. t* o5 I解压jar包3 B! n) ~5 L; N, e# S
, N  f% j1 c) d+ ?/ H: c% G' r
jar包是java归档包,但同样可用unzip解压查看里面的文件:% t% @3 y) P, y
unzip -o java.jar -d dir
' s  E4 x, r9 L' Jgzip7 f, W$ o5 s# G: j  R6 m
! n- n/ f. y, A& {
涉及参数说明:" b' ]0 ?- F+ e5 h! @: j0 M3 D
-k 保留源文件, n" L, Z" Z$ H. d, _5 m
-d 解开压缩文件
- y+ O! E$ g% y# h+ o0 [-r 递归处理,将指定目录下的所有文件及子目录一并处理
/ ?- X* k; Q. J) g' N! A6 M-v 显示指令执行过程& J, `- {) |: |% b8 l. N1 h
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
" r, r" H8 K% w% G9 V$ J- ggzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包' |- Q9 m) f* I) D
gzip -rkv ./* 递归压缩' ]. D- L' C/ N- H! `- I1 x
解压也很简单:3 U! P" p2 S6 ?- E9 O
gzip -dv test.gz
/ a$ U; G: T: U8 B' Q3 Tbzip2
3 {  e: e8 S! n7 C0 `1 d: E6 T* f5 W3 g
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
1 L8 w5 W4 _9 f, ?( xbzip2 -zk test  #压缩test文件
0 ?$ f* _2 e4 t: c; h$ W* mbzip2 -dk test.bz2  #解压) r0 g: a3 P' J7 J$ M  \- G
rar/unrar; M/ @! @3 [  j9 o' D7 ?6 e) N
8 r6 n& O& V; m' m7 f7 p
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
" U  x$ _6 k/ {( f# srar a test.tar test  #将test文件压缩为test.tar7 {# L, V" r2 Y3 E( _% K) e2 R
rar e test.rar       #解压test.tar, `4 B: m9 @' _3 h# T, {
unrar x test.rar     #解压test.tar9 Z% c! u2 A; i; z
压缩率比较5 N6 K. D" j/ x/ m5 ~8 l4 I6 H
5 e/ O7 G" A5 E  f
压缩率一般来说:" ?- j4 v8 S# F! A, q; T/ }
tar.bz2>tar.gz>zip>tar: @4 g0 ]4 Y( d: @+ n4 _+ t1 R: P3 D
压缩率越高,压缩以及解压的时间也就越长。) x4 j$ L+ s5 Z5 l, l' ?
总结: S: g" v# s9 @. j5 a

. m0 `% T! V  e) D7 r对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
' n1 `- X4 i5 i! D0 l有任何补充或建议,欢迎留言^_^。/ z' B: R5 Y0 U' }4 a9 H
( c8 c  }- |) l' N& B  c
1 u- M5 E; t5 Y! u7 m

8 p7 y: V& a5 |) F

2 n9 N, ~, N% D& Y, J& Q: k

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-25 20:47 , Processed in 0.057978 second(s), 32 queries , Redis On.

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