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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

9 R- h% H$ G' t3 s! P& ?2 P
' X9 i4 x- l8 m  G# U; t/ x

6 V! d. r$ Z9 g$ D( c前言
" ~9 r$ q. t' w% ~) y
% X8 y7 X/ s/ N% iLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。  k+ D4 K7 d- |
tar' e8 u. ]1 z& ^% E. e% L
0 Y' e$ D4 e) x9 F. L
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
8 x0 k: C2 K4 Z6 z7 S涉及参数说明:

( k! \/ N8 K2 W! _/ W" i-c 建立新的压缩文件
& y9 s3 h' }& I: v: S: }9 _-r 添加文件到已经压缩的文件
- n/ w0 R5 k9 A$ d1 U6 d8 S-u 添加改变了和现有的文件到已经存在的压缩文件
7 X( W8 w0 G! M4 p5 ~-x 从压缩的文件中提取文件
( @. K( r. M+ ~6 ?-t 显示压缩文件的内容1 ]: n7 S+ d5 Y9 U0 `9 s# [
-z 支持gzip解压文件
+ L% G4 B# |  G+ K- m-j 支持bzip2解压文件
1 z7 E# s" {& t+ w' B-v 显示操作过程
: O; C8 ?& q% k9 @( y6 M-k 保留源有文件不覆盖
6 L/ c% k  A7 A9 V8 T/ s- @: Q-C 切换到指定目录& _6 X0 ?  x, B1 ]0 V. O7 `
-f 指定压缩文件
' d# M# l$ R$ n8 D, N$ j
9 p2 V% r% f+ P+ U; k8 ~--delete            删除包中文件( h$ P7 p" u$ u. \) R5 J" x
--strip-components  去除目录
. O4 c1 H( U% v' |--add-file          向包中添加文件
5 Q9 Z6 \9 w$ P* y) |! C4 D7 j压缩
. \/ u9 ]/ n$ a( i/ G" r; t8 R0 l) a* z
归档tar包,不压缩( l+ q0 r/ P8 a/ A1 o
0 F/ I9 l( I% {8 f5 W; W) {
tar -cvf test.tar test1.log test2.log #归档多个文件
. N. r6 u6 G$ G/ h/ A( jtar -cvf test.tar test/*  #归档test目录下所有文件
# }5 D! t+ O4 ]9 a& q. L1 Htar -cvf test.tar *.log  #归档所有以.log结尾的文件 3 ?2 Q+ [: g0 S6 R' [' e: g$ n; d) Y
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。  o: }  b& S1 e8 s0 F
归档并压缩为tar.gz或tar.bz2! M1 C$ P6 W* f( _& ^. q

0 R  }# w1 U! ^4 K! U" L5 k这种方式打包对文件进行了压缩:3 ~. b& b* A7 i& X1 h1 u2 f; R
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
4 B/ J- x8 }' |8 utar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩4 F' ]% R0 Q( s- h& Y: ~+ j' H2 b9 b
查看压缩包中的文件
8 l7 a1 A3 J6 x7 `5 j$ Q2 [* Y" \* k8 i. C! t+ y2 i% {
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:1 x  @5 _# U. V* G2 q3 z
tar -tvf test.tar #可查看test包中有哪些文件$ t. V* Y' f& S" P4 @! ~/ R  M! M
打包后删除源文件
! ~2 a3 ~# ]) ~7 V: r$ g$ Q) {  R5 `! W; l" p( q+ k5 O1 [' e' R
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:: r' U; g0 S! F" T1 r1 l
tar -zcvf test.tar.gz test.log --remove-files 8 Z# C; e9 i) }4 W; n% C
打包除指定目录或文件以外的文件
# k! O3 W. x# k5 y% R) g# M! v& e- X* n) d3 c  I5 h6 s5 U
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:) u& k, P7 J4 b7 p. g
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
" Q) I  C0 x0 N0 S: n+ M; q9 ]" e这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
7 P; `/ O" y- U3 I; U5 L) L向压缩包中更新文件
% d: N2 U/ {3 h. h9 R0 d7 }( D) o7 Y: D3 u3 P% x0 e+ K
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
3 u) n- ?+ j" b1 W9 e3 N( v* |+ utar -tf test.tar --add-file=test #只针对tar包+ d( V# T! H) E5 w8 o' ^* o
向tar包中增加文件9 I  v1 L( @3 U3 [" W
. m) W2 C" g% c- T' z
向tar包中增加文件可使用-r参数:
0 j& o4 d' H( P. C4 N- ^tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
+ I4 Z1 S3 c' ^) A删除压缩包中的文件
* J$ V' [0 B7 R8 c1 B
/ S0 S- l8 e  `6 J9 e3 }8 S; g在不解压的情况下,可使用--delete选项删除包中的文件:% C9 ?6 h* u& `! |( [
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
7 f2 k  `2 D2 [* j  ]) m6 @解压
$ L, r, \2 X- E' K9 T
- h' l( d1 O% `6 r4 r* d解压tar.gz和tar包到当前目录
3 [- c1 c& O' x  k# C8 E1 c6 s& |: S6 l3 ^
. w+ C9 i2 q3 C: Ktar -xvf test.tar.gz
/ u; k& z1 |- {* u4 k  c7 ]tar -xvf test.tar " ]6 k2 f1 c6 ]: n; r1 f+ ~; W
解压到指定目录2 q  h# y* [: d* ^
0 G- ?+ w* l. q' g
tar -xvf test.tar.gz -C dir+ A6 w  d- O7 L+ @/ g: t* |  O
tar -xvf test.tar -C dir
" l% \8 d: o; Q2 Q8 h解压包中指定的文件* X5 ?6 b% ~" ]. |) g  E( C% W

6 Q6 k9 \5 L$ V7 Y% @+ A1 _例如test.tar.gz包中文件情况如下:" m* u( m! h! E+ Z
1.txt0 j$ [" ?5 B& I3 T  Q# p
log/: C* S% t. K( b
log/1.log
: }8 q4 K3 c2 r8 Y& D9 l$ c: Plog/2.log9 M- s. X8 M/ ]& _, @
log/2.log& M+ U1 z0 d4 ?- K1 Y2 r
log/4.log( J- v8 T6 G$ U' n. ]7 j) |! @
log/5.log3 y/ G; o/ q/ i& {# r& X9 D
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:( V* ]- M& Q6 q( H, P" r% V4 v5 E
tar -xvf test.tar.gz log/1.log
6 ^( K7 m7 z! s3 N, V. G' M- mtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
8 \1 a2 }5 q* n  p0 N: C1 Y& @0 N解压时去掉目录结构
  r- @2 H7 D$ z) R6 A# |2 W7 l. f8 `# Q* ~
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
6 h9 ?- s" w' I) {) i3 rtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
% b" o2 l: \: V: U3 d  y解压时不覆盖原文件/ C9 F. R( D) Y" Y

, O: W/ L2 U6 M- @9 I4 a/ i- j. M当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):) ?. S5 R, l- N0 y* Z
tar -xvkf test.tar.gz
( w6 M& h" C/ `" A, [5 d1 i特别提醒7 {6 J5 o3 K0 c+ f1 D1 x, V

% D' o$ @7 \) H1 l3 M3 u1 a前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
  s6 }" G9 t2 x- xzip/unzip+ O! o: |, X' |- b' {, v9 D( g
4 i3 L& n5 k8 ]* V; ~( {
zip和unzip命令主要用于处理zip包。
# x4 F$ m' k8 b压缩' p5 j; W1 m. |9 L& `1 Y# R
( ^1 e" c% |% \; M) C$ K/ L# U; u  Y
涉及参数说明:' c$ l0 l3 w/ n' R7 k
-d 从压缩文件内删除指定的文件。
* `) w8 m  ]/ ^" R- O; `# ~) s  m1 k) ?* n-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
3 J" Y6 O  U: c" n, u$ L-j 只保存文件名称及其内容,而不存放任何目录名称。9 E( E! H4 A; o( n! @/ V
-r 递归处理,将指定目录下的所有文件和子目录一并处理。& p1 B1 \* C$ L5 H% D3 [
-u 更换较新的文件到压缩文件内。6 L6 M; d2 o8 L2 V& F# k4 s* v
-v 显示指令执行过程或显示版本信息。: T* P& ^2 X& N% n4 W. d' @8 N  F
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
: o* g+ W: T9 f, t. h; ?% m- <压缩效率> 压缩效率是一个介于1-9的数值。
9 E- t2 v2 u! p压缩文件
0 G1 h* o( X9 K3 V0 g+ T0 `3 \& o, o
zip -r test.zip test/ #打包test目录下的文件$ }/ E5 a! \+ D' ]( A2 V2 e
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录0 P! h9 Z- u  s8 T: O! Z7 A
指定压缩率打包文件
' |- X  q: e, C+ ]4 s+ p9 v
; @" I. p, S& g# z, ?zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
! ?, e# E( v3 o7 v6 m4 B/ m打包符号链接文件$ Y! S4 E# C& {% R) M

- ~# D" ?) s" i6 Y) _' d前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
* R4 ]$ s. C( {! s/ A  R' }zip  -ry test.zip test; P9 c6 |6 u, o, X9 \2 y( v0 ?
向压缩包中增加或更新文件: T; G6 j8 s/ q8 o
  S1 f( t! p' |" }$ {* ~0 J0 P
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
. N7 W# K1 g  k9 o' {2 pzip -u test.zip test2 #向test.zip 包中增加test2文件
- {! |" u0 a2 E! E  v9 Y压缩时加密& s7 _/ y' N$ f) p& _

! j$ r$ a- a, \) h5 z- |* a压缩时如果需要对压缩包进行加密,可使用-P参数:( X  P0 l# X" C+ j/ |
zip -r test.zip test1 test -P 66666 #使用密码66666加密
- F* t; g2 G$ j% u" k% Y删除压缩包的特定文件
. g# `8 }! ?# p6 O) O3 t" Q  H3 A% L+ U* j3 ^! M7 P
zip -d test.zip test  #删除test.zip包中的test文件
/ B1 O+ t+ H% Q. K解压
9 i0 x: @8 o0 ]; N& ^8 e
* r7 e5 j, _: V  r% r涉及参数说明:
+ s+ _, r2 K, t6 j  N) D& _. Q-l 显示压缩文件内所包含的文件
; z8 \0 J5 T0 o: E, G# k( L-j 只保存文件名称及其内容,而不存放任何目录名称。
* O! k) e4 y, x) c2 S. K4 ]4 s& k-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该3 d" x+ |, k5 d+ X: B. |3 _
-v 显示指令执行过程或显示版本信息。
$ F1 A! ?% y8 T* a-d 指定解压目录,目录不存在会创建
3 u) P+ ~- J7 S6 `! [8 M; g查看压缩包中的文件信息- w2 n1 U# h  e6 }% |
: ?9 _* J$ }, g7 I& J0 K" _* l) Y/ ?
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息! U: y; @' s3 [* k* ]
unzip -v test.zip #查看更多信息,例如crc校验信息等
. [! H2 i& j' K  B解压压缩包+ s* o5 B% s) A, H& l1 Y

8 O! @" x* o: ^  j9 i* Nunzip -o test.zip -d dir #讲test.zip解压到dir目录
3 X7 R9 R8 W' w2 p' n解压包中指定的文件
3 g5 l% Q" v" G5 \9 U8 M: M- u8 G' o  U( b6 i# G! C5 E
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:' S4 M9 }, @- f7 L: {6 N
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录+ I( p0 b/ p) m# M4 q
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件, I8 @2 W) x: w6 y8 O' H
解压时去掉目录结构  z9 m  G3 M+ ~: W3 Z

6 l4 Z1 d9 k/ c# i9 h压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
7 _" I  e  \& [" k. s4 o' wzip -oj test.zip -d ./temp  1 a$ m+ O; w. L9 ^
解压jar包
9 y) D1 N# l, r. O% W1 B
. {. l1 E, K& k0 [# qjar包是java归档包,但同样可用unzip解压查看里面的文件:0 d) K& V. V. ^9 S5 C4 d/ F2 j
unzip -o java.jar -d dir" |! c! _7 U! h/ K; i3 U# \$ C
gzip2 A$ j  S; i! t, l4 H. p8 B" Y
5 N0 ~2 A) z1 c, n( y$ X
涉及参数说明:9 D% t; k) Z" A" K
-k 保留源文件
/ j8 ?0 X$ H6 ?  ^4 g- h-d 解开压缩文件4 r+ X% F- u% ]" @5 L: [% n: N1 L2 l
-r 递归处理,将指定目录下的所有文件及子目录一并处理5 X3 C- z! L  B5 c
-v 显示指令执行过程+ i* E  G/ H3 \. T& d
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
2 v" w( P3 O0 r. [3 sgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包) V6 f4 K7 F( ^
gzip -rkv ./* 递归压缩
, O. V2 I. y% R" U- n. t4 U解压也很简单:
9 w4 R" a" u4 j8 q8 }4 _gzip -dv test.gz
0 j% q. b& C1 \5 dbzip2
0 K+ n. p2 O# C
5 m% @& R! t1 itar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
0 w" D8 }& H# ?6 l5 Q, Rbzip2 -zk test  #压缩test文件$ ?  @8 v( A6 X- v! U
bzip2 -dk test.bz2  #解压
* c* [& \8 G9 s* zrar/unrar
1 ?. M% K' z* ~! i# O- z
( o. o/ E( W: W, N0 [' P' Z) k( m3 Qrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:; {4 J3 P* L) p: Z+ o9 i! b& w
rar a test.tar test  #将test文件压缩为test.tar* m7 G1 B) l0 D7 r* \
rar e test.rar       #解压test.tar; h9 E. G+ o6 G1 t: E5 f9 l3 Z( L# {
unrar x test.rar     #解压test.tar
& x- }7 K% m! K& w9 R压缩率比较% m/ _* a8 `( {1 X# z; q
( q7 |" Z; t" n' w6 l
压缩率一般来说:
0 J( g  g' r; Q' n3 R. s/ \2 Ctar.bz2>tar.gz>zip>tar0 A/ f7 |5 I8 ]. `& O
压缩率越高,压缩以及解压的时间也就越长。% R; C- s( |$ Z
总结9 G, v) q! D+ T- S# l7 `$ \

) w! _# G, ?8 Q: @" p0 c, I  ~对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。2 ]! T1 l. L% J' _+ k
有任何补充或建议,欢迎留言^_^。( m( p5 J1 {4 m- T% S

  o& n# r/ I% L, U, O
: R& o9 F6 T: W# W7 t( z+ _
4 H% F0 N4 S9 }* u; j* h8 O6 F
3 p& {& N0 P6 }: ^9 u

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-15 14:39 , Processed in 0.058692 second(s), 33 queries , Redis On.

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