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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
( H! j7 H, X: }  |5 |6 ]8 ]' e

4 |0 q: k/ ?! ^0 k: I

9 n# B( t0 n' g9 X前言" L+ K- I/ c/ W. m

7 q5 Q8 Z/ h$ r2 c  ALinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
/ }! j" j, ?- H) _8 Q1 S6 x0 ztar
3 K3 W$ T8 A3 {" p( X" w
" d: [" _* N3 v6 l# G8 Ntar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
4 j7 v) y! \6 |( e; j/ M涉及参数说明:

% F" K: c* S) P-c 建立新的压缩文件; B3 H3 h% I0 A5 j( O
-r 添加文件到已经压缩的文件
8 R, |5 F  F: f- j. g; t-u 添加改变了和现有的文件到已经存在的压缩文件
& P; y2 U: H: P5 y( Z- _! g-x 从压缩的文件中提取文件
0 `! |6 z3 Y) v- M2 j: f$ k-t 显示压缩文件的内容$ G7 X# c) a4 f# i# C
-z 支持gzip解压文件
1 x& Q3 v; k1 H' D/ {8 c-j 支持bzip2解压文件
3 x+ V" c; `$ w% R-v 显示操作过程( r3 {* T% |8 m/ }8 a
-k 保留源有文件不覆盖3 |: {2 w* v' e; z- c
-C 切换到指定目录7 L" |. e9 f/ u7 d7 |$ T$ x0 ~% Q
-f 指定压缩文件
7 T( Z0 z# |* m. ^  ]" I! ?7 p: d- x% \9 V. j
--delete            删除包中文件( g: Y7 H0 Q, C  X
--strip-components  去除目录
1 K0 \5 f+ L2 r--add-file          向包中添加文件! F' x( t( J4 z( K+ A
压缩
3 D$ t( N* j  f& B
) O% I6 R2 G$ [2 b1 k% h归档tar包,不压缩
6 |( K0 {3 v5 b, m0 K# E  x* x
3 N: A& J& Z3 U8 h3 otar -cvf test.tar test1.log test2.log #归档多个文件
8 j% K3 q( B* N# G" @" ^# vtar -cvf test.tar test/*  #归档test目录下所有文件
6 H& ?+ s, p9 ltar -cvf test.tar *.log  #归档所有以.log结尾的文件 9 \* B. I7 ^7 n6 k6 i
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。9 I0 z5 c5 L& }5 n
归档并压缩为tar.gz或tar.bz2
' I7 x5 [" \$ s" B$ u! x
9 K, ?1 O# C  L& n这种方式打包对文件进行了压缩:
/ V) I* C  w. G* ]  r- g+ w3 ^( rtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩8 p% V3 W) w" @! [/ Q
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩; O! t( \, V5 e- p% `( l$ Q
查看压缩包中的文件
% c8 q* ]- U" x0 }3 |* V3 O$ D% c1 K: n% [" @; ?8 I
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:0 c5 s* Z' _5 X3 T( o( S
tar -tvf test.tar #可查看test包中有哪些文件+ [& O$ v& g. b) _0 j7 P* {
打包后删除源文件
7 i7 _; y+ e. N6 c! Y/ w7 V5 ]% I. R
  [5 r; \2 }( |5 E8 l, Q有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
" ^: u# c) h! _. B; r6 _% Ptar -zcvf test.tar.gz test.log --remove-files % G. _& |. m6 R& J* w2 D1 M
打包除指定目录或文件以外的文件
) r' `7 C8 {+ [7 H
7 h! g0 h! y/ f2 U: a$ z对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:# }4 `) e! ]8 e) n' Y. Q1 @
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
% V6 X# L4 @5 F9 @这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
" P! |: F3 s4 g向压缩包中更新文件
* Y) G7 e/ t3 F/ k' T7 M: c" h6 J/ X$ f! r, J9 R( l" U2 d
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:. ?, n( L. o  ~- X, Z! \( M
tar -tf test.tar --add-file=test #只针对tar包( ]! M1 K1 z3 n- u
向tar包中增加文件0 w# e+ x- c( j. S7 @: z  U; p
( o: U5 R4 i% d' C9 O
向tar包中增加文件可使用-r参数:
: K* E5 Y5 D$ [$ v2 ^3 k; k- q4 ?' ctar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
# G8 `$ h$ N2 Y删除压缩包中的文件
% A1 K7 Q' R7 F0 D' O
& }7 J+ K  m) e" m  Q9 |* y在不解压的情况下,可使用--delete选项删除包中的文件:/ p( ]3 Q- N" F: z, w# p+ f, ^
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
/ C* W+ o) M% F$ p1 J8 _% d解压
) S( n) D' @$ O* j  r3 C- \# b% c9 Q( |, `; ?% N) |9 d& y: ?7 E+ }( E* @
解压tar.gz和tar包到当前目录  C* @7 r# U. |% B. P' s' E. {

7 L: u& u8 u5 ctar -xvf test.tar.gz2 t) l1 O4 R/ n
tar -xvf test.tar   W( \' T/ ~- s+ J" E
解压到指定目录* T( x4 ^; h3 |/ _4 R

8 Y8 K7 W5 }0 Q3 z7 W! _6 L( \; Ntar -xvf test.tar.gz -C dir# D9 S1 j% A: k! `* [
tar -xvf test.tar -C dir
# x% U/ y4 V0 d1 \. j: Q) k解压包中指定的文件
' t" G+ ^3 g  t. B7 a
+ c8 |6 d9 K9 v1 ~4 k# T例如test.tar.gz包中文件情况如下:
8 m" A3 }3 i- C: H6 r1.txt
0 j0 ~" ?, l' p" P* u' Alog/7 A2 l- U: k$ a: m2 w5 z4 [' h
log/1.log
- u" Y5 `: C9 x" ?" ?! ylog/2.log
( C/ \" z( u8 h$ Elog/2.log! O6 l$ J' S) ?6 w) K: W( F
log/4.log
8 Z4 D; x8 Y8 s. N7 V( `log/5.log0 L7 W" d7 H3 W# M$ |+ T
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
& X: h  y8 S0 \% ~5 m0 _tar -xvf test.tar.gz log/1.log; X0 B0 ~2 {; r3 f: p
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
. W6 B0 y7 U) F解压时去掉目录结构! l- d- o% D4 v5 n* p

( R; ~- B" s# X2 f压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
. y; x6 @" ?7 e1 h1 Htar -xvf test.tar.gz --strip-components=1 #去掉一层目录
, J. q0 |* A: E7 @+ J解压时不覆盖原文件5 l) ]$ J# s1 \/ @

6 E3 N5 U. V4 {; f" }- S当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
$ F7 }" }, E$ J% Etar -xvkf test.tar.gz
0 b, g7 R' e; F2 s  i( m特别提醒
& F9 e' Y/ S6 X- ]' L
: F- R$ c0 L& C6 }% [& Q) I; A前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。. i7 r  T# h& k2 _# a0 T* v' S
zip/unzip' m, E6 a9 J& B" o2 R+ C
, L/ ^' v6 Y& R
zip和unzip命令主要用于处理zip包。% B: t( \! i( ^
压缩9 R7 C5 a6 ]& p* F- y1 z
5 t, U6 q, w, _' h
涉及参数说明:
; N' s8 j) ^( b/ c& M6 N2 T# j6 x-d 从压缩文件内删除指定的文件。: I1 z/ i% X- H& ~0 U1 e
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。2 ^' |) g5 b3 c, Q
-j 只保存文件名称及其内容,而不存放任何目录名称。
  B* o; F1 w4 R% N0 L# n-r 递归处理,将指定目录下的所有文件和子目录一并处理。: S9 W% A0 M$ `
-u 更换较新的文件到压缩文件内。
! c" c/ o) p- c) d* l3 ~-v 显示指令执行过程或显示版本信息。. J2 s6 _! C; F
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
% \& E* s1 o- h! q- <压缩效率> 压缩效率是一个介于1-9的数值。0 d3 R* [% p* g1 s
压缩文件
8 O* J+ n: \% H# s% \4 i- F" ?6 ?9 K: y
zip -r test.zip test/ #打包test目录下的文件2 o! n5 A+ a* s; t3 @% Q
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
$ \; P$ c4 [" b$ T: l3 G7 {8 \指定压缩率打包文件
, k: y& j" y$ k* X. e
) X* V$ t; z3 C% J$ o; Q: rzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
* o$ p  u4 }- u9 N7 U! }1 _打包符号链接文件8 N7 P0 l! G2 z  r0 Y, \6 t  N: S
, ^' {( _) Q( l2 L1 G1 j5 S
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:1 b9 C: A" S7 p" O
zip  -ry test.zip test
2 W0 x% d* S3 p5 D/ f向压缩包中增加或更新文件2 b* O! e& T( I' M! }- g

+ _5 N1 m8 s* a有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:9 P- h* P+ D! p. @# R
zip -u test.zip test2 #向test.zip 包中增加test2文件
( w9 N3 _5 h1 V4 k7 M压缩时加密1 U4 X/ ?/ _' x* s
, z3 B/ X9 ]! B; ^/ y  }
压缩时如果需要对压缩包进行加密,可使用-P参数:: y% y0 R6 a- @$ |9 l
zip -r test.zip test1 test -P 66666 #使用密码66666加密
2 e8 ~! u( ~+ k* t' f删除压缩包的特定文件
" }* s/ V' u& b; [# ^* x, }7 _+ R* v; i4 p$ {7 k5 w
zip -d test.zip test  #删除test.zip包中的test文件
1 V% `- J1 n+ O3 H0 B9 x/ f解压; R3 L" E  Z& z" ^+ t

6 `3 o- [6 j: {, D) K$ R8 }涉及参数说明:" q2 o- ^' D& U& z
-l 显示压缩文件内所包含的文件
$ Q" b! t# T! u" E3 _-j 只保存文件名称及其内容,而不存放任何目录名称。
! h2 ?) [& @0 A4 `-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该. i) e  S) w# y5 ?" ^
-v 显示指令执行过程或显示版本信息。+ L0 @) a- Z/ z% G
-d 指定解压目录,目录不存在会创建6 G" Y# Y& j+ D9 p, H/ G
查看压缩包中的文件信息
% q. w- u) E6 G& Q5 n, F/ I* B8 b/ m' `: j. |+ ?8 \
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
+ H8 ~2 P! Q6 ~, c6 T) R6 J: Funzip -v test.zip #查看更多信息,例如crc校验信息等- ?9 r' |# z7 m
解压压缩包& z5 O: B3 X( u4 M& a# b  u
) x5 a! f) W, y; \+ R' z, {
unzip -o test.zip -d dir #讲test.zip解压到dir目录
3 [/ U4 p) f; X& r# Y解压包中指定的文件
& X: z. z- W, N& E
6 L2 Q, t6 O) P9 _" o( e如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
/ h( B7 G' h/ vunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
% S* ?5 }: h' G% y" Aunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
3 d  `: B) B( e) N解压时去掉目录结构
$ s$ Q6 d& R* |0 F6 w6 L% I6 R7 _
& b/ [# e  l; J- d7 M5 K" V压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:+ ]- U+ i% h  m/ K4 O9 X1 E
zip -oj test.zip -d ./temp  
7 t; p( Q* c3 K3 [- ?解压jar包2 Q8 e% Y6 z0 I/ ]7 Q0 `
2 ?8 O9 e8 E5 s0 G9 F3 d% ~
jar包是java归档包,但同样可用unzip解压查看里面的文件:
9 _' O" }* S/ x2 P# ^" w+ l/ W4 yunzip -o java.jar -d dir- u) h8 x1 k9 U% [
gzip: P( F1 V5 z. l/ M
( r; X/ L) ~) K
涉及参数说明:
  N  e& A0 v$ {; l-k 保留源文件
7 e; T+ s2 s( Y2 T-d 解开压缩文件( b9 V8 _: T* R
-r 递归处理,将指定目录下的所有文件及子目录一并处理
$ F* ]" @, {  ~-v 显示指令执行过程
- L! B2 w2 u  N! U+ [tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:# F) H4 W* D; v2 J( z
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包" N; B/ i& D; z8 b( q. ^/ Y6 F
gzip -rkv ./* 递归压缩
5 ?& ~8 i; r+ T! v5 p解压也很简单:
9 q0 b- }, ~% U9 }7 i1 qgzip -dv test.gz ! m9 s  K- s$ G
bzip2
7 d8 ]* i8 s+ z# l4 d$ m1 Z# S4 }$ Q2 C- Z0 t) E. X
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
  a! ^' D" r- l; L- Tbzip2 -zk test  #压缩test文件
: c% [- V+ {5 u- j2 m' a' fbzip2 -dk test.bz2  #解压
' k6 P5 j- p+ p' w* |rar/unrar, d) m7 r; _8 S3 n# p% W) O

% X; Z& \- ^2 l8 _: q) \) P; W: @4 krar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
+ Z0 C( R5 y% {! q, Crar a test.tar test  #将test文件压缩为test.tar4 c# v: b: O1 \2 }& B% a# m8 |0 E
rar e test.rar       #解压test.tar9 n1 J" q; K  Z) E% J. A, X( Y, ?4 v
unrar x test.rar     #解压test.tar9 m3 F" ?# l. S2 P. F/ X+ r' z
压缩率比较
) ~$ O# I8 e8 G9 H6 q! K. O( Y& T( K' B$ ?5 G
压缩率一般来说:
0 x5 I, ~$ a- p! otar.bz2>tar.gz>zip>tar1 ~- W' R. E& N5 z
压缩率越高,压缩以及解压的时间也就越长。
/ |; L$ V- c$ \- v' M' \% y% @总结0 S& d+ B. d; P4 E1 [

0 {# O6 r/ M. D$ K对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
6 ]! ]! u6 d7 M/ {7 g有任何补充或建议,欢迎留言^_^。+ ~. G( \/ M* A
$ |: o7 y4 v' i  M! D3 _, C

# {$ z+ [) Z& P% C2 ]
* s+ ~# b3 `. ~! o8 W: i) p
( q) F7 X- U$ J" e6 @

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-8 22:31 , Processed in 0.065265 second(s), 33 queries , Redis On.

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