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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
& D  e: |7 M7 l( {# m0 Z9 @/ f
2 B+ w6 ^( l: j
& a" v9 y, p9 _
前言
1 K- I( X; b2 h5 y/ k7 M" G9 n5 M% Q# p8 u) }
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
4 q5 z4 B$ P1 s; b; d  Etar
3 S: U/ k& d% R" e5 k7 d1 O
6 u/ y, m2 l) @& jtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
0 T; m+ c7 j6 y: X: O  u1 Q+ w4 ~涉及参数说明:
: u  \0 e' F5 E/ r' r: B$ b
-c 建立新的压缩文件+ F4 Z4 f+ i! ^+ a* D; L% h
-r 添加文件到已经压缩的文件
, p6 a: J5 U- D1 K: f6 |-u 添加改变了和现有的文件到已经存在的压缩文件1 u( r* \5 E0 T# u9 j
-x 从压缩的文件中提取文件
- x6 V: ~7 J  I& J9 t-t 显示压缩文件的内容
8 O: _* u6 L% _9 O3 r% D* B. X# g-z 支持gzip解压文件+ }6 S' m; {9 ]6 w
-j 支持bzip2解压文件" a- n& ?0 q. |# l
-v 显示操作过程
: V% e  H3 u6 u+ H% q6 F-k 保留源有文件不覆盖
: N% T+ M, F, t-C 切换到指定目录; S3 F3 V2 W& d
-f 指定压缩文件
+ V" f" n9 a! E# j5 g
# P( x1 k$ [& [6 T--delete            删除包中文件( m7 x6 E( P1 u4 t
--strip-components  去除目录& y, e0 p4 g+ ?: e' W/ f
--add-file          向包中添加文件
7 X, R. @8 I6 z7 N# H& ?. I压缩0 y& \# g4 \$ ^  n( t9 _4 V
  h& h  g& M% j" f
归档tar包,不压缩4 q) G/ t8 U( k/ K. t- c4 P8 D0 c
2 A1 H" J3 i% {
tar -cvf test.tar test1.log test2.log #归档多个文件2 D. t; t# x) ?" ]. ~% O
tar -cvf test.tar test/*  #归档test目录下所有文件
) N0 ?0 h" P$ g2 ^1 p& N* [tar -cvf test.tar *.log  #归档所有以.log结尾的文件 3 e) d+ N& g4 \9 h# q
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。9 |' C& o6 ]+ m, Z5 J+ g* I, \7 Y
归档并压缩为tar.gz或tar.bz2
$ }  ^4 l  `9 N" [, q, n
: g. g  `3 L4 q5 j1 B5 E+ [6 K0 L这种方式打包对文件进行了压缩:9 b2 a$ u. u+ w& Q, @' v( c
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
. Z7 v6 L- q1 o2 a# i0 A8 I9 Wtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
( K8 k" _& k& |+ J. Y查看压缩包中的文件
: _0 s9 c( n# [2 j6 \
% A/ ]5 _" y  u( K" ^5 s3 K- A如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:0 m+ g4 I% _6 Y% L. y
tar -tvf test.tar #可查看test包中有哪些文件  b9 x% A9 w' i) U" |
打包后删除源文件
9 T( j% A4 D/ m. i  A9 Z/ W3 j" m
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
+ D0 W0 B, j6 V# R+ E$ ?! Ftar -zcvf test.tar.gz test.log --remove-files
4 b8 E0 Z' X0 g打包除指定目录或文件以外的文件
! L0 B5 [8 h8 }) [* i7 Y; b5 S2 h8 J, R  t7 q7 f1 K9 I- F: {
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
, w( h. X- }3 P# ?4 Y# x, dtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
) V2 c) s" x7 s8 I这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
' q/ `" s' l4 S) x0 H  C3 B% H1 a向压缩包中更新文件
3 y# \, \6 M# a: F: e- G
9 `, M& v4 E, `# x% n6 _例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:; v# Y/ P5 S- D( [. A. q) I- v
tar -tf test.tar --add-file=test #只针对tar包4 b- W; b8 N% W# e/ u
向tar包中增加文件( L+ r" v# S) }8 j+ A7 f- w" }

  b' ?' b  c0 R$ J向tar包中增加文件可使用-r参数:/ z+ q2 m" p) K0 I+ u% o
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
6 a8 @5 [& X4 Y0 X) M4 p* h6 e0 J删除压缩包中的文件. l2 {0 S" T, S! x

% H$ p( G5 e  S0 n在不解压的情况下,可使用--delete选项删除包中的文件:# O' t; ?% v) ^0 f- ^- T
tar --delete -f test.tar  test1 #从test.tar中删除test1文件+ W+ |! W3 W! o) {. a
解压( y  K+ d. n7 c2 z
3 B1 e: e3 K2 K
解压tar.gz和tar包到当前目录
( S# I, D8 f5 x2 r6 J' ]
, R1 i, g1 _7 ~3 s* m  H* `tar -xvf test.tar.gz
: f% V3 X% @  M7 ntar -xvf test.tar 2 X0 k% f5 Y" }" J
解压到指定目录, g2 L) J7 }1 A- s
, F% r* v9 i9 @7 l( b: z# w* T
tar -xvf test.tar.gz -C dir
( J; W7 b' n3 F: x1 r4 \# Otar -xvf test.tar -C dir7 |4 x: n0 V: A0 P3 D
解压包中指定的文件
2 S' W) H  A9 V: R3 q- n
! F8 v  b8 O+ Z8 w例如test.tar.gz包中文件情况如下:
9 ^: v5 S; |; K( L. S6 _, A* m1.txt/ Y% x% B0 p" p  J# v6 y+ h7 N
log/, E* A" Y# z# t# l$ F7 @: S! [. n
log/1.log1 Q9 Y* J9 ]$ I8 M+ n
log/2.log
( q- v' B0 b) J3 Y# klog/2.log
: Y1 A' _, m' U* Z* alog/4.log& O7 s, r8 U# J& B3 O5 [
log/5.log
* x- v. j  o7 A9 t6 f3 J如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
4 t7 J  C  }# w# s3 U0 x" Ktar -xvf test.tar.gz log/1.log9 h  g! {2 T* @" E9 |: O
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录, I4 M" v0 c& {0 X
解压时去掉目录结构
; }1 i* {1 ]3 Z+ j% S$ g  v9 G4 _* t/ v1 ^7 C* A
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
* i- {8 `8 o; g8 \: Ktar -xvf test.tar.gz --strip-components=1 #去掉一层目录
7 K4 _9 Z# R2 W5 w' ?解压时不覆盖原文件
+ P! q: Q. w! w% S. h
" J, N; X# \7 N. v1 x2 N2 v6 L* ?% e当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):" B2 U* I  _) i9 t8 z6 f
tar -xvkf test.tar.gz3 y0 |+ q/ _4 n0 l8 R/ m8 S  I" P
特别提醒" w4 Y! R5 }5 A" Y) N- ^4 g

; ], j1 e1 M8 G2 p前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
% _' P. e% }% }8 P: p8 g' u! B- pzip/unzip
$ q3 s, S. |. O6 _+ A
& l: u# ^. q2 {+ {zip和unzip命令主要用于处理zip包。
9 ]* u' y) Y8 z% x* L压缩" E$ d3 G/ R6 }  ^2 f+ W
# d7 L" d; T+ z* o; W  U
涉及参数说明:& ?( q+ u( x9 N6 S3 m. p/ Z1 W
-d 从压缩文件内删除指定的文件。
$ ^" }# z6 g4 u8 `+ {/ y* ~-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
& x+ j; y, g: N( `-j 只保存文件名称及其内容,而不存放任何目录名称。9 Q4 U2 s; n: H$ \& h% z+ M- a
-r 递归处理,将指定目录下的所有文件和子目录一并处理。( F. P+ z' k' o$ M3 _. `3 `
-u 更换较新的文件到压缩文件内。& u/ X, X# H2 ?1 i
-v 显示指令执行过程或显示版本信息。
9 T- g  f& e8 p, D! ~-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。& e# ]6 m7 X( n
- <压缩效率> 压缩效率是一个介于1-9的数值。
; g5 W6 V( o1 z! i: W* G$ P  T压缩文件9 C+ T/ Z5 i+ o+ F

% R- L1 ~( J  E/ Y. kzip -r test.zip test/ #打包test目录下的文件+ `+ o/ t3 s' W) g
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录$ @/ |! L: M" h
指定压缩率打包文件( S, D2 _# ?5 s

. X  C8 u- i2 G2 i/ S% U' ?$ }3 Szip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
6 T0 m: p! o7 ^0 n  \打包符号链接文件
3 D. c* x6 c& |: ~1 O% P* G$ v4 P
( r3 J' X- q& \+ }6 C2 [) q. Z前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
8 o6 w- @4 X* u3 n* o1 g9 S8 azip  -ry test.zip test
. }: G9 \' F  Y9 z* m向压缩包中增加或更新文件. Z1 P4 c/ B$ L3 m9 C  N, H$ _0 }% f

( [0 ^# Q3 ^1 j/ x# ?. N* r有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
1 p. ~6 H& j; D( }9 J2 l  [, B' Wzip -u test.zip test2 #向test.zip 包中增加test2文件; l- W% R# ^( K, X- c$ a; E
压缩时加密
" Q' X# m; g" w. m. k! l" L; y" L; o- X- [% Z: X  f$ ]
压缩时如果需要对压缩包进行加密,可使用-P参数:3 m3 A" Q, g; D% f- k
zip -r test.zip test1 test -P 66666 #使用密码66666加密
$ @4 d1 \! r) w$ i8 M删除压缩包的特定文件% U5 p8 b" o- |, z2 U3 ?, N9 r7 r

+ x7 |9 [( S0 Q9 s$ J" dzip -d test.zip test  #删除test.zip包中的test文件
- q" x. v4 M! C, u1 W4 `解压
: ?3 r8 e6 b8 @% V9 g( o6 Q/ m# @9 u4 Z7 h5 m+ Z
涉及参数说明:( W# R! {4 A1 u/ n/ t
-l 显示压缩文件内所包含的文件7 }( S( G& H- s! {  Q3 A$ w
-j 只保存文件名称及其内容,而不存放任何目录名称。7 ^. \6 \! o6 `7 p4 L2 T4 F6 Z# n, \
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
7 C6 E+ g5 R) l% [0 a-v 显示指令执行过程或显示版本信息。
3 a0 ]5 `) m+ i3 M* ?/ ]/ Q" ]-d 指定解压目录,目录不存在会创建, w6 l5 @- f5 Z2 ~/ \
查看压缩包中的文件信息) Z) o% L! k5 S

* ]# ], S" L' D2 a% e3 sunzip -l test.zip #可以看到压缩包中的文件名,日期等信息8 ]% h4 W7 D3 X6 p) a' B" w
unzip -v test.zip #查看更多信息,例如crc校验信息等
0 z# i/ Q! Z/ i7 Q2 b解压压缩包
8 p" m6 w, S* E$ J, Y0 h( h. w8 _) F6 V% W
unzip -o test.zip -d dir #讲test.zip解压到dir目录
: x8 i/ m" C8 Z# c' ?解压包中指定的文件( X: k+ [" ~9 Z+ @4 R! ~

& i* q9 ]" }, q如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:( b6 f9 C- n. \/ b* m" W" z& k
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录+ b9 _( L/ D3 w/ c  K
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
: ], v3 `' W$ ^2 X4 m: ^/ V解压时去掉目录结构/ L8 D& N9 ?! [" z6 Y1 H! h: o: a
8 \/ O. Q; I) o2 U. q
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:2 f6 W! ?/ V  E, `5 ^' J- M
zip -oj test.zip -d ./temp  
8 q1 d! ?( Y7 p* Q2 D2 b解压jar包
1 S) B1 ?' R  W6 b  K: R/ h% u0 {- f- G
jar包是java归档包,但同样可用unzip解压查看里面的文件:( s  G' z1 y1 j4 P
unzip -o java.jar -d dir
. |3 x- w: S% O$ t& T* S' fgzip
% L  K: X1 p+ i' P7 K  j/ |
3 q0 _& P& d# E( z- ~- @涉及参数说明:
$ |" ^( Q- P) M-k 保留源文件/ a0 e2 |+ K! @- x  n
-d 解开压缩文件: h+ h7 H9 r+ m3 C+ l, X
-r 递归处理,将指定目录下的所有文件及子目录一并处理. V& F9 b5 D( O8 g+ B8 ^
-v 显示指令执行过程/ W# j2 {. }* P. ~; @* b
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:, G! G4 {- @! k' m# r# T7 C6 Z
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包. ?0 l2 |2 _; \
gzip -rkv ./* 递归压缩7 x. `5 z- R# P% w% ?0 j2 q
解压也很简单:" x6 T4 L% R* k+ @" a7 E$ `
gzip -dv test.gz * M, [- ?) B4 n' V0 ~: ~- n
bzip2! _* w. d& O. t* W4 U( m

" N+ f# {/ S1 i" vtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:9 g3 M+ M5 B5 D1 k
bzip2 -zk test  #压缩test文件
/ e, O2 T7 y- w6 S8 Tbzip2 -dk test.bz2  #解压
! m  t- t6 j7 n/ prar/unrar
1 }$ N0 c5 ]1 g5 X7 j7 p6 b6 i7 l; H9 i- d; n
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:, i6 m" V1 E! {7 B/ ~* T
rar a test.tar test  #将test文件压缩为test.tar
' t. O4 t' L6 w9 jrar e test.rar       #解压test.tar
( T5 E4 G, y3 d! N1 q' @8 `9 b+ eunrar x test.rar     #解压test.tar
" H5 b$ P( `' _; w压缩率比较" W: `2 M1 L" U8 _5 Q6 I

9 p& S4 ?% Z% o压缩率一般来说:3 f; V) K* P$ x
tar.bz2>tar.gz>zip>tar
- W" N8 c6 G/ L9 b1 K3 x& y/ Q压缩率越高,压缩以及解压的时间也就越长。
, ~8 O8 A( ^8 t2 V总结
' D3 r$ V' z3 h1 w' g: a) a* }  g
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
+ g$ v, _# z9 t: Z有任何补充或建议,欢迎留言^_^。
" h; B- W( C1 P, [9 Z- G, I! Q7 f
+ E+ K6 v1 p( c: L" T

( b% A7 k8 e0 }& R
; v5 T, F  n! ?6 ]4 t; k; r

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 13:21 , Processed in 0.064291 second(s), 32 queries , Redis On.

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