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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

) }. y& V) w- v+ U) l* R
1 ^7 F* z' f. b8 D5 |

9 r* x/ Y& ^, E$ ]1 g$ ]2 T前言
2 z9 @5 G! I7 G; s& v- R$ G% {8 L' g
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。" ^6 i1 i! b0 R, `
tar$ D' F6 `0 k6 r+ i
! v' N7 f; `" {7 r5 G
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。4 X6 D* ]1 r: U. A& t/ r7 X
涉及参数说明:
, R( f! C: b4 v% R/ j
-c 建立新的压缩文件- y4 ^5 H, C; j) H' R8 ^
-r 添加文件到已经压缩的文件0 y9 a0 b$ H" g
-u 添加改变了和现有的文件到已经存在的压缩文件
! O9 o" M3 H( j9 k9 j-x 从压缩的文件中提取文件
/ l# [- S# d- T* {-t 显示压缩文件的内容
  _2 T  e0 {# w/ o4 J4 Q3 e9 B-z 支持gzip解压文件; n3 ~8 n4 _! t0 k/ Q+ j, Q$ [, d
-j 支持bzip2解压文件/ \* R# L# x/ e3 k; h
-v 显示操作过程
) ^) o3 x3 n0 |5 ~: @& z* r-k 保留源有文件不覆盖
6 y) }3 O- a; L9 m( F-C 切换到指定目录
8 Y( `6 C# t5 c( d-f 指定压缩文件
# K; C6 }# D9 R7 z3 c
8 w* l( I5 p; S: m4 W( ~: Y$ s--delete            删除包中文件! F& K4 _/ r6 z% P  l0 y8 x
--strip-components  去除目录, |" V. m% f0 L
--add-file          向包中添加文件' }; z; S9 F! O
压缩3 {6 S2 q) ~; i8 W

1 K% o- B& {! {6 H( A" ^归档tar包,不压缩
, t1 P$ ~. `% ]. c- e' S4 \  s, c' o( b( f" |* ]3 M$ q# c
tar -cvf test.tar test1.log test2.log #归档多个文件7 Q" `8 O: w! ?4 e" ?
tar -cvf test.tar test/*  #归档test目录下所有文件4 h; D) x/ r, v8 l' b2 J8 f
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 % F( V; T; N% ~5 K. M: N) ~
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
$ ]5 ]+ X" Z1 ~$ m* `! A8 W归档并压缩为tar.gz或tar.bz2
; \6 V- b, r5 z$ ]: [0 T- |! y# k) C5 r$ f
这种方式打包对文件进行了压缩:
3 A- k3 L0 A, P$ @1 ctar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩+ r2 |6 k, Z3 T. r( {# ^" W% j
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
2 c* j3 w; F, P. [9 g查看压缩包中的文件' S' L$ z% I* ]# U! {; y( l: a# E
/ {( ?* c# H& T2 g7 G4 N, K
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
; y, n/ F0 e. Etar -tvf test.tar #可查看test包中有哪些文件
; I& C5 A! H) |* z7 x7 p' @+ S打包后删除源文件
+ R* }1 Z# Z; c) j! i: [% U( ]# ?% N3 b' ]7 `1 c: n
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
/ w" g9 }1 H: T& jtar -zcvf test.tar.gz test.log --remove-files
7 S0 U5 @8 {( D' o$ Z. {8 m打包除指定目录或文件以外的文件4 a% g8 q/ T$ ?- {) _: L

/ O# D3 G8 ?9 ^* n  ~对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
2 x, l1 }  C( g6 t8 X! ttar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
3 Q; `% y1 d* b9 U这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。6 W& W# c5 |; B" J. K: L- k
向压缩包中更新文件  f3 y( q: r* F5 i4 @7 {

- ~* _" X2 Y& t5 G( g7 S# y例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:; q3 q9 i" X( v. c6 {
tar -tf test.tar --add-file=test #只针对tar包2 T9 a* s* T2 @/ B: K
向tar包中增加文件" q* e( j* \4 E+ ]/ w! N

. D+ K9 {; `$ O0 `1 m; V9 T向tar包中增加文件可使用-r参数:* K% j2 I( y& B6 ]7 a6 H
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
- y% S& H7 h; Z1 j* S8 A' }; ?删除压缩包中的文件
% V5 z# q7 B5 B- h6 d1 G- J% @% ^1 H2 _) Z$ @' @# @
在不解压的情况下,可使用--delete选项删除包中的文件:
0 _# [4 r* d$ g4 q$ u- R+ R1 {tar --delete -f test.tar  test1 #从test.tar中删除test1文件
! r; _* a7 m/ f& x: x7 _" z解压
5 s5 z0 k( g# f& C2 C8 h
1 |; G/ {) Y: r* ?- U* B5 N& p4 A  p# a) M解压tar.gz和tar包到当前目录
4 _: q& r6 |( l/ K% X6 s6 A9 h: X: U
% }4 T$ n& F$ Etar -xvf test.tar.gz
0 D$ u, P3 ^; z0 star -xvf test.tar 9 Q; H# I: t" o! M
解压到指定目录
5 m- ~; k: ~, I
( x- K  \2 a- L* ^tar -xvf test.tar.gz -C dir4 h. R- l0 n: Q8 ?
tar -xvf test.tar -C dir3 {0 J5 N! d7 m, O' u/ R4 m  ~( x  I
解压包中指定的文件, I2 }0 }9 ~& h" v
' j$ S# d$ z" K& H9 s! }
例如test.tar.gz包中文件情况如下:
6 u4 z4 x2 v! _) f1 n1.txt
$ K/ D6 |8 M9 ^4 plog/- s& }9 y" \, j* ~
log/1.log
& J. z, P0 ^" l% i# ^log/2.log
; g* `  X0 L2 s7 Q$ `; Wlog/2.log7 _- K" O; v8 B0 }: G8 f( f, O0 m
log/4.log5 }, s4 J0 k7 S0 i. |" _, V
log/5.log
9 I5 o& _( {, L% a- s如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
0 N! C. a. H5 |5 x6 I+ I; Star -xvf test.tar.gz log/1.log
, _' W! d3 W% E1 x" I% |tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
0 l4 }4 _$ V" z2 \解压时去掉目录结构! q8 K: t# \& L

1 V6 Q7 U: \% t8 P压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):! \/ [* }# h5 V) u. M9 Q3 f4 g
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录! ~& V% ]+ F# |* X
解压时不覆盖原文件
+ A, {& t( S4 B
5 M) P, q% V7 E2 V! @3 Q- T* X当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):7 ?* B) ^' v% Q' A% s2 B: A
tar -xvkf test.tar.gz3 B' A$ W' T! m: ]; c5 ]/ y" t
特别提醒3 j. F- b6 c9 C. v( I. C1 `

+ A% [: o) H& d1 X% u前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
7 U- N0 Q5 _) Z7 H6 |+ D5 \" N! e+ E+ q7 F& ?zip/unzip
8 d, F, Y' ^4 x' b3 D' E# y7 h- J/ h8 s( k
zip和unzip命令主要用于处理zip包。, q; S, R" n( n5 s8 N$ m, ]- R
压缩5 {! ?7 i2 M  I& z% j9 E% O
% w% E+ M1 K5 h. F& {" b( D
涉及参数说明:% l. B# O7 A' D& Q1 J# b
-d 从压缩文件内删除指定的文件。
2 S' @  G. p9 ~- H! ?# H/ Q* S-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。7 j; h7 u$ W) J3 p
-j 只保存文件名称及其内容,而不存放任何目录名称。
5 [, @& ~- z  z( V+ a-r 递归处理,将指定目录下的所有文件和子目录一并处理。4 m2 N& f* C+ o) K
-u 更换较新的文件到压缩文件内。
. P1 z: _1 d% M1 ?  |4 s4 a-v 显示指令执行过程或显示版本信息。0 n6 t5 r  e6 B# n. l7 w
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
' d. G6 C5 p' a) k8 p- <压缩效率> 压缩效率是一个介于1-9的数值。
  W: h% r# b3 b$ E6 [" L压缩文件
6 h3 h2 P; s' k; d' {; }2 v! j, x! ]1 U7 Y5 h
zip -r test.zip test/ #打包test目录下的文件
& A: B4 R- H. Q8 u2 V. W- \zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
0 y) K' ?- t' I* k/ g3 \指定压缩率打包文件3 h4 l2 r! G# ?! d' B; l
9 B5 W2 F( ?* t; ]
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
8 a. I' o+ y+ [. G7 ~, b4 Z打包符号链接文件" _9 P/ z9 v) }/ M2 o$ I

3 G7 ~( N* h" f) G# _( U前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
4 I! V" K+ R$ M5 E  e  ~; r/ K  Mzip  -ry test.zip test
# k7 h: l: I% \5 S# @0 ?* B5 }; W/ `5 M7 ^4 V向压缩包中增加或更新文件
6 }2 S# N) i; h2 I' _7 B0 |) j" P0 i$ F# s* |, E7 a
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
3 t$ K/ \. i& j0 d) hzip -u test.zip test2 #向test.zip 包中增加test2文件, v2 K# \2 s8 M2 c! a+ j1 ?
压缩时加密9 k; \/ ?2 G# v, X6 O3 ]$ s3 V

, O0 b' d/ @, x! K压缩时如果需要对压缩包进行加密,可使用-P参数:5 e7 E& A+ t7 s2 T
zip -r test.zip test1 test -P 66666 #使用密码66666加密: ~0 b  Q$ [" i. x6 ^4 G) A0 `
删除压缩包的特定文件& P0 I3 B0 ~+ f. [# E
9 J# X1 X: x* R+ S6 U$ y8 [" w5 x
zip -d test.zip test  #删除test.zip包中的test文件
( S6 t5 O. T( e) Y8 G% G& y9 a$ r解压
) x& R) r2 b/ i' g( M' ?. ]( j& e& W) n
涉及参数说明:7 C0 `! y( p) M' p+ v* w% W
-l 显示压缩文件内所包含的文件7 e* F) z. N* m' g; \- h4 H& T
-j 只保存文件名称及其内容,而不存放任何目录名称。/ J& Q" r% x# @' v
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
5 \/ J" E  B2 Q5 x2 y4 T* U/ \-v 显示指令执行过程或显示版本信息。$ a* X8 M' z4 {4 e
-d 指定解压目录,目录不存在会创建
* A* d+ z9 o" \* Q查看压缩包中的文件信息
/ a/ E) q6 T: g9 [" c! w, d( _& D8 ~* o6 [( f
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息' v, i2 u$ {8 e' X& K! y
unzip -v test.zip #查看更多信息,例如crc校验信息等
  d/ w  Z0 n: l" E3 C$ E5 S( d解压压缩包
- z; K' S7 d7 q( F+ Q6 a* p; f3 G+ g7 C( G9 E0 ]0 O; j) j
unzip -o test.zip -d dir #讲test.zip解压到dir目录' E' ?% [) E! V& @+ ?9 F" j
解压包中指定的文件
4 B  H% t- b; P: U. a# V8 i
& O3 [: O! V. m1 _6 g3 B, n1 z如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:' I3 C. }. i9 Q. _7 {" c
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
! [, A8 ?  H* I2 n( [unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件* G* R3 @, }0 ~. I, R9 H4 H
解压时去掉目录结构
$ R" W5 P3 ]! u/ F* Y0 ?/ t
  _$ p* u9 ?1 o' L压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
4 V7 k" o& u" m  ]. Ozip -oj test.zip -d ./temp    v9 a; @! ~3 |( [! F# S. ^% P
解压jar包
+ v7 |& [# R. B+ k5 o1 ]9 Z- ?
3 M' D# G% H. z7 ^jar包是java归档包,但同样可用unzip解压查看里面的文件:
, p% B# `0 V3 [unzip -o java.jar -d dir7 i% o$ {: L1 ~* c3 g
gzip
4 @. R" ]$ }8 z$ ]' Z
+ M3 O9 R5 h8 D  G, Q9 X( V涉及参数说明:
. t1 e! c9 M9 E' C: G/ }: e/ g5 g-k 保留源文件
8 f. f" N- y. v! P1 }6 K: x: K- V" `-d 解开压缩文件
; s2 o) P# S# ]. C) r$ u$ d$ n+ |-r 递归处理,将指定目录下的所有文件及子目录一并处理
7 a9 r' G; k( k# M/ U' r-v 显示指令执行过程
8 w. E5 m8 t: i0 Z, k4 _' mtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:: E8 H) ]# k3 m  r, E# Q' A% m# Z
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
% l+ j* L% P/ g3 B1 P- Z' wgzip -rkv ./* 递归压缩
" K4 Y; @5 Y1 _' h解压也很简单:
# c5 Y5 }' j( s0 o2 |* Lgzip -dv test.gz . s9 R9 v+ P0 @7 S- |6 W& L
bzip2
# `/ G. a: K) E, o0 t& F+ n5 b! L. s8 X, k1 c
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
  j: G$ l$ c9 z2 Z; G; H4 L" ~bzip2 -zk test  #压缩test文件
7 p5 \& K6 e/ s" d# ?bzip2 -dk test.bz2  #解压
( M9 M; }$ b5 y. u! grar/unrar
' a7 X- n* ~% ?& W1 D6 c1 n  R3 s  ]3 Q3 U9 k! H6 z0 U3 i
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
% \5 a/ P) q/ J+ r/ ]# R/ F. b( x8 c9 Q& ~& Mrar a test.tar test  #将test文件压缩为test.tar
, |; o7 Q& w2 d6 Xrar e test.rar       #解压test.tar
1 I& t$ ~6 S# @, sunrar x test.rar     #解压test.tar
1 _" K  O  n  R! Y( E5 P压缩率比较
8 B# S  W6 S. C4 i& F. ~* y$ f  q5 Y; L( k* T7 [1 F) G
压缩率一般来说:* y( ]/ ]1 o$ A
tar.bz2>tar.gz>zip>tar0 _2 w7 q: g# y7 B5 C1 \
压缩率越高,压缩以及解压的时间也就越长。. ]. i1 m* g% T2 ~6 D
总结  Y: w; B" U3 \9 M
7 H8 o3 X8 L' s6 T; R* h
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
. ?3 u; l  E" F) g% _. O$ h4 l! t有任何补充或建议,欢迎留言^_^。& w. H2 C1 M! S
) ]2 c" Q" Z1 r) x

5 O: k& ]: p+ m/ _) k) B& K: z2 D2 _& U0 G1 W% V

1 [, t7 F7 l0 O- W

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

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

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