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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

* [* e) j: `5 E4 Q8 @! g6 I9 ?, `0 m
) Z1 j* T) V3 R' l; f& H5 V  w
前言  S4 n; h, s* p/ t# i9 ]0 x( \
9 k& I: x+ L# ~
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
0 q3 H) y4 B3 K: q4 ~! xtar0 K: O  D: G" F3 y$ k- i1 |4 s
* v6 e- B; a* s% l
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。1 ~$ D+ R& W5 O0 T
涉及参数说明:
0 S6 X! ^  g* a$ {) h
-c 建立新的压缩文件
0 i+ W6 C- f2 a9 A8 F4 B-r 添加文件到已经压缩的文件
# }, `; j8 `# z- J-u 添加改变了和现有的文件到已经存在的压缩文件
% |  a4 f$ n( j  y( w; t- u-x 从压缩的文件中提取文件
5 C' y, o$ ?8 K$ `& T0 W" [# h-t 显示压缩文件的内容
9 }; w& F  X' v$ s-z 支持gzip解压文件
; |+ C$ o8 X; z) J9 G2 F1 R-j 支持bzip2解压文件
3 i0 L* j- v9 `4 O$ L# l7 R1 ~-v 显示操作过程( A8 ?) b9 B, S/ a- W
-k 保留源有文件不覆盖7 Z7 I  b. O+ Z3 l8 |
-C 切换到指定目录
" o% \, m3 M9 v0 a4 |$ M5 H. x-f 指定压缩文件
2 u- V3 e9 w* {: m3 [2 b6 ~) j$ W. y$ D: r, w: V# s
--delete            删除包中文件
9 y+ m6 ~$ z' k! g5 ^6 K: ^: h! k--strip-components  去除目录( a3 a" d' ?1 ~# u. K& y. V1 w2 q
--add-file          向包中添加文件
$ x; P# `  N5 l- S压缩
3 y" P. O8 |5 n8 B" H) ~6 x4 Y& D6 e! z, `/ L& ?" C
归档tar包,不压缩+ X' ]' [! E, d5 H6 E8 {
9 x+ x8 ]/ e5 ?  Z% k
tar -cvf test.tar test1.log test2.log #归档多个文件9 B1 c6 m8 u* s4 J1 |/ {& ~: U
tar -cvf test.tar test/*  #归档test目录下所有文件- Z- Y8 a, F+ y
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
5 {7 T, J2 S- x由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。3 z1 e$ d: i$ s1 z
归档并压缩为tar.gz或tar.bz2
8 o# r" B' q  m  ~1 q/ Y6 r. T* ]' A6 Y8 `* Y/ R
这种方式打包对文件进行了压缩:( Z) b$ [9 o9 F$ u) p" e
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩' a5 k& A( m6 H( W3 `
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
& L& N# d( l6 C查看压缩包中的文件6 |4 ]' ^' Z& e
  [0 Y9 o% d0 K) M2 Z- U# v# r  @- I
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
3 [2 L$ ^  s- T. star -tvf test.tar #可查看test包中有哪些文件
1 z* b4 F9 `" k/ Z打包后删除源文件
5 K4 ?' O  Q4 [0 [2 y/ l
) I5 _* f0 }( r有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:8 }; o! d9 T  ?) J4 m
tar -zcvf test.tar.gz test.log --remove-files 0 K1 p7 V' `3 I0 y
打包除指定目录或文件以外的文件5 E( _0 F0 @6 D  r" ^: z1 k
% B1 p3 ]4 Z, G' \9 l7 @
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
2 _5 k# X& Z- q6 r9 I. S  Htar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件4 T# A: j. W# H, l
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。, s; T% p4 y9 x9 P' T! U
向压缩包中更新文件2 W& S8 K1 e( G: v8 N
2 `# t# N- J: i: t+ J; L
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:2 d8 i8 M+ b5 R7 _4 @
tar -tf test.tar --add-file=test #只针对tar包
# _% n& z( U2 P/ R$ S  Z8 J向tar包中增加文件8 Q' _  B; T3 n
* t4 _+ D7 ~4 D) ~6 K  |0 `) h
向tar包中增加文件可使用-r参数:
: J) v; O: |; D2 ftar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
7 D, F3 b" M" d$ g: d9 S/ f删除压缩包中的文件
+ [# c1 S$ g; f5 c$ P
" T9 o2 o4 t  V2 A% `3 }* L9 c! L在不解压的情况下,可使用--delete选项删除包中的文件:$ L& e3 g6 w, U% h
tar --delete -f test.tar  test1 #从test.tar中删除test1文件1 g4 x/ Y$ K$ a5 W9 A
解压
" `. V, B* h2 I& B6 d* }
7 j6 S+ R7 j  p2 T6 r9 f) q解压tar.gz和tar包到当前目录
5 j; {  f# Q" {2 K* v% ]" d3 k, J" f( F% [: f& ]
tar -xvf test.tar.gz
$ N* }2 z. N8 X; T, h5 V# {$ w& ytar -xvf test.tar
8 w% G+ |+ a: x$ z# x4 _5 z0 g解压到指定目录; k% r+ a+ Q- K3 M. w
7 M/ Q4 \, `3 t( r  a
tar -xvf test.tar.gz -C dir
- h3 C/ f" F; f( M' b% m& ztar -xvf test.tar -C dir
* e1 G( I, f7 _: i4 f, t; C3 C解压包中指定的文件
7 E+ D( a# Y+ U( E& {' V; c9 e% Q4 w5 G
例如test.tar.gz包中文件情况如下:
- L$ B1 e3 `1 p( i7 Z1.txt
' ?& e, _. G, P- R# {3 \log/
6 T) g4 B* h" u9 C2 \0 g) rlog/1.log3 I# I, ^- W& l/ J$ F# v$ |
log/2.log! Y* k3 i( F5 U2 E
log/2.log! A3 \# V0 N* s# R4 Z
log/4.log- R4 L' `6 P/ R/ ]: \: S
log/5.log
% P; G( N+ W. e: _% p- u如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:# S1 X+ Z. b5 e1 W( j& E+ o& m$ i
tar -xvf test.tar.gz log/1.log# s$ c0 a7 w0 h
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
  n  x' A$ X2 B( i2 Q2 P解压时去掉目录结构4 }0 f' M, R" W, }- f! E8 L  J+ m

+ V# M5 F& @) G+ q5 a! p压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):) c* f8 d+ H. k. E
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录! R% F6 w' m, Q3 L0 L0 O7 Z
解压时不覆盖原文件  C# s# Z2 m4 _  P
: J0 T: `$ {0 R% A2 z+ ?" t' a
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):+ E# k' x4 D7 R6 B9 ?
tar -xvkf test.tar.gz
3 w$ K+ H* @3 H5 d: o; U/ V9 }) k特别提醒
7 K& r/ V8 X; U- ?' n& P5 O/ F; Q7 W
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。$ `* Y0 W. c3 M
zip/unzip( V. g2 _9 d1 [* Z& f

1 v  y, K% j  \7 Q- |" t- |zip和unzip命令主要用于处理zip包。' v9 R# A- U/ F: _
压缩
. N4 w3 P6 Q# [
, C5 Z( m! d2 r( C* S( g3 j+ u涉及参数说明:
# |& m6 ?" a: V! d- _) a" n-d 从压缩文件内删除指定的文件。) J- }: y, _1 B
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。9 O* M# M+ B' g0 s; M! i2 `
-j 只保存文件名称及其内容,而不存放任何目录名称。7 h5 P7 P, t% w4 W
-r 递归处理,将指定目录下的所有文件和子目录一并处理。* a  F' o# i! o0 B
-u 更换较新的文件到压缩文件内。
" U& ?& K/ v( y-v 显示指令执行过程或显示版本信息。
# m% ~9 c$ `+ H2 j+ k2 M/ _-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。7 D/ i3 M7 E, M( i# g" Z5 y
- <压缩效率> 压缩效率是一个介于1-9的数值。
# ^' i, Y' W& U压缩文件6 y$ t4 z; O/ x, C0 o! g0 @# W
" U+ X9 C- K: |" P
zip -r test.zip test/ #打包test目录下的文件
2 o2 F" a9 b8 [) I  ?zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
2 D  h" V& s6 @$ N指定压缩率打包文件1 u8 D$ b  O* `# I% T  I3 k, r

0 s$ M/ B* d" rzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长2 g2 m& @8 y! F; e, ~5 N6 L- q
打包符号链接文件
9 w2 ^1 K% w7 t+ A% r
+ c9 o" c* u7 i  X! z# J. }前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
9 e' H  ]  a5 A# u# V3 g' F: rzip  -ry test.zip test4 ?2 k- w' j5 j, l6 T1 |
向压缩包中增加或更新文件! g1 p. R# S) ]% J# s2 [/ H* g
, p4 E! N- L5 A: o2 x" _" z
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
3 r" C7 Q, ?4 |3 N& fzip -u test.zip test2 #向test.zip 包中增加test2文件, o1 P: x4 |# D4 O% k+ r
压缩时加密! O( U. j- s0 t2 e
8 H# b7 g& P0 Y! @; f
压缩时如果需要对压缩包进行加密,可使用-P参数:5 D/ h7 m) q6 s, J* c6 J
zip -r test.zip test1 test -P 66666 #使用密码66666加密+ I% j# t: K6 Q4 c7 @
删除压缩包的特定文件) Z' f5 Z: E( E2 I0 E
: V; O6 Q% `* z7 v( _5 R( ?1 N
zip -d test.zip test  #删除test.zip包中的test文件
% I8 j$ z7 z' P: g9 h; u- }解压6 t, ]# m* L8 _; b, v
( r7 A8 W7 l4 Z& m
涉及参数说明:
* T0 {( E9 X/ d! K7 u-l 显示压缩文件内所包含的文件: L* h6 K5 j0 o+ h8 F7 R$ c
-j 只保存文件名称及其内容,而不存放任何目录名称。0 e3 U! K; u' {% S9 D+ C+ O# x- E3 U
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该$ l) i$ u3 r2 v3 B0 ]+ ^
-v 显示指令执行过程或显示版本信息。
% n5 [' ?) c" J; b$ T-d 指定解压目录,目录不存在会创建% M" \- P( l. L- N( B: ~
查看压缩包中的文件信息$ Y1 b0 F9 r' _. Q

. s7 }7 a5 v" Cunzip -l test.zip #可以看到压缩包中的文件名,日期等信息2 m/ }/ K; ^3 g, c9 A. g) R
unzip -v test.zip #查看更多信息,例如crc校验信息等. N; }* H  ~9 @- B& q' z
解压压缩包
# y- a  q) }5 ?$ a6 x; [+ M
  h' b+ b" V7 C! P3 u8 Junzip -o test.zip -d dir #讲test.zip解压到dir目录
/ v0 T3 J5 L$ b$ O# u解压包中指定的文件
, o& U( G0 ]$ q5 w# n; i4 s) O. P3 J" ^: t" H# k/ Y
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
) L! G6 `# h# B1 P& G! X" runzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录2 `, E( z# c- i- `: e) F9 w" I
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
# c& Z/ @% h; M$ E: C# g/ F解压时去掉目录结构
* M0 q3 g$ p: ]5 t" |. g
. P) {6 S: z3 Y( {3 r压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:0 Y+ p$ ]* J* D( n
zip -oj test.zip -d ./temp  
: K% r- v" D. u. A6 R解压jar包1 b: c+ o/ j, |. p& h% ]& K6 I) r
5 D2 y' s8 l" q  R
jar包是java归档包,但同样可用unzip解压查看里面的文件:
3 }2 l# U4 u8 {6 C! l9 M3 ~unzip -o java.jar -d dir
0 P# n) d( u4 C8 I) Ugzip* a6 E* l; r0 g9 g
3 S4 C' Z; l' |. R  H* r5 U7 u
涉及参数说明:
) ?6 e9 S3 H& b/ N( t: g2 U  @/ W! U# U-k 保留源文件
' l+ A- h/ I! Q" N-d 解开压缩文件
: C% F: B  R% A# j9 |-r 递归处理,将指定目录下的所有文件及子目录一并处理
3 @9 H9 u# ^: g, P; }-v 显示指令执行过程0 T% M5 r: {/ V# e$ k; B
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
1 s, _+ N. a2 Ygzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
" U/ U( [5 b/ c) u: A/ q' Q8 Zgzip -rkv ./* 递归压缩
& t7 ~3 Q  B- E6 y4 y# J解压也很简单:
7 V/ [( B. O# I+ b! vgzip -dv test.gz
; c9 M! @" u. }! A9 ~  x( y) qbzip2
" W+ E* Y) e7 ^$ {& E, q! C5 A5 J; E1 U! F$ D6 j
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:7 a: f; x  I7 ~( b+ j
bzip2 -zk test  #压缩test文件
$ E1 d& X* G. v- r. x: dbzip2 -dk test.bz2  #解压+ {( X7 @! z% y& n% W- Z6 [: J1 T
rar/unrar
% k5 \9 X$ m7 O7 I" M, h5 S7 ~
7 `+ v3 @& \) s2 Brar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
! T' H3 r  P5 I+ r& {rar a test.tar test  #将test文件压缩为test.tar( u7 C/ z- s1 q5 W+ J3 ]
rar e test.rar       #解压test.tar
4 ~  Q* u' q( L: \" i( A) O1 S' R& t8 Kunrar x test.rar     #解压test.tar8 z1 R" `; n4 X
压缩率比较' F4 v* B7 F; f' [

8 S3 R# Y& H( r: o压缩率一般来说:
6 L8 f; f3 q. v8 V+ a# g' ttar.bz2>tar.gz>zip>tar
; E7 E2 D6 E+ ~! A压缩率越高,压缩以及解压的时间也就越长。
5 N2 _% T* A- i1 y总结6 j' q4 ]+ }5 \! _7 I. n
# E: y+ p. j2 Q/ Q( n: M
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。' e" O7 ]  \. e- @9 x
有任何补充或建议,欢迎留言^_^。& X" d/ i+ Y5 ]9 q

! c4 `  i! d+ {: X8 I* b% v" Q% U& g5 w. B8 {( ]5 r3 t* c; N
- a" e0 R! A: a$ [

& L) A4 S1 l; j% B

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

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

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