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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
+ @( Q) q4 s7 y" k+ A0 [; T# T
& I1 Y  k9 D  }# Y5 j( W
& r3 W" o3 P' W3 M
前言7 P4 L) K+ d, t1 N
' z  O3 a7 m, J3 d% m6 P, s
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
. G2 Q8 R0 S# K8 Q; _4 M1 X" mtar% i+ P% J: ^; M% j% [' e! A7 A* B

9 m: S6 N- }& b5 ^2 |tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
* h! [+ |$ X& o4 H& A9 H涉及参数说明:

# }5 b5 s- {1 C7 G, Q-c 建立新的压缩文件
8 l7 ^6 \; a3 ~- R% n-r 添加文件到已经压缩的文件' w1 u! U9 o$ z5 m
-u 添加改变了和现有的文件到已经存在的压缩文件' T; [6 i& Y8 S$ W1 o2 [2 g
-x 从压缩的文件中提取文件
( ^, y; V. a2 r- d" a. J-t 显示压缩文件的内容
, [" Z+ C  r9 l/ P' {& v" j- V-z 支持gzip解压文件, I4 N3 I" P( t
-j 支持bzip2解压文件' Z7 M$ f) e3 u
-v 显示操作过程5 _0 i$ F3 M5 e
-k 保留源有文件不覆盖
8 I0 M- |; c5 ~6 ^6 x-C 切换到指定目录
* V5 c- t3 P8 U: y6 y% z. H-f 指定压缩文件
: `9 v1 h; @) z5 G( i/ Z1 F: \  ~( v1 {$ r& Y: m/ M3 v4 g4 u
--delete            删除包中文件
5 E7 n6 d' V0 {7 B6 R1 G--strip-components  去除目录& n9 k2 c, K4 v+ h. j/ B
--add-file          向包中添加文件! y, A4 W) K7 a2 A& b
压缩2 s$ H7 Y% [& s5 V' v+ E, w, G
: d3 |# m5 D$ i5 _+ a
归档tar包,不压缩$ ^0 [* K$ L! {, x3 R. ?
# f" w! _3 |$ o- i1 C
tar -cvf test.tar test1.log test2.log #归档多个文件
; u- r# K: f7 V! [tar -cvf test.tar test/*  #归档test目录下所有文件8 M$ C  H4 y" ~$ D6 }/ ?
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
0 _* U2 R, _% t$ b/ I% u7 w由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
* Z) L8 O1 x/ [" {6 N& y6 z5 U* `归档并压缩为tar.gz或tar.bz2; J$ J5 b" ]. H6 N4 ^5 t0 X5 G% u
- S4 h8 U& ~. B  A# x- r/ |$ ~
这种方式打包对文件进行了压缩:& ~# R0 d7 ^1 L2 g: B# U
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
" S& b; h4 [% W6 gtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩# {5 I+ w9 F+ W9 C4 y: R
查看压缩包中的文件8 j: [( x2 S8 k: M

0 z* N  i! C  z( H* U2 U如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:# S" N7 Z# a' _# ?
tar -tvf test.tar #可查看test包中有哪些文件8 x6 a- `% {6 S# R9 O. E: M5 A8 X
打包后删除源文件7 F7 V: o' q1 P  M
& b, @, ]% ~3 a1 \1 H: c( V
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:  @$ }* A2 `( f( a1 S5 y& I
tar -zcvf test.tar.gz test.log --remove-files 4 u$ y3 P6 g; T% s# i6 Y# b
打包除指定目录或文件以外的文件7 I. r4 y2 b0 h# {' M) T5 t5 m( |
9 U; V. S/ }( H3 ?% ?' T
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:9 I, B( b( @! r* r- I4 _
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
! g- `1 E0 w; a这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
  x% f' D- H2 \. Q向压缩包中更新文件
( h) C$ t( `0 ^/ C/ o; t, W' M' H% B. w7 v0 W- b0 c
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:1 a' ?% ~) ?! U- ?, g' \% Z' I
tar -tf test.tar --add-file=test #只针对tar包
8 e9 c  _5 G' Y0 ^* H3 L) l向tar包中增加文件
. ?- f" a7 S7 J, x1 H- E
' L5 N) t$ H% x. Q向tar包中增加文件可使用-r参数:
! I+ N" s5 H( z& u: c, ntar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
7 ]. o) t1 }( ]% p; G+ u, S删除压缩包中的文件: ]; \: n  v  a1 _+ v# L

' ?; G; D0 a& S+ T! H% ?* K# `# W在不解压的情况下,可使用--delete选项删除包中的文件:: G* }- a! h1 \! j
tar --delete -f test.tar  test1 #从test.tar中删除test1文件2 c6 _$ Q. f- M
解压( W9 c' o! m; j$ \( K7 n7 A! `9 V
+ p2 T! c6 M2 p5 L
解压tar.gz和tar包到当前目录7 K4 l. @# I( t) F/ J; H  U' e0 v

+ U4 c/ k# j( H. u2 _* Otar -xvf test.tar.gz
: {' ^7 M; e( W) c! o  Gtar -xvf test.tar
- X( ^/ T, H  ]! ?* F: h3 t解压到指定目录# j( C2 e0 B( O. O1 r# c
8 e, i' e" f8 h8 K7 @( q, ]
tar -xvf test.tar.gz -C dir3 K; q+ L1 V0 M& L; o
tar -xvf test.tar -C dir7 ^( m; r) y$ n$ D
解压包中指定的文件
+ i) R/ m+ Y5 t# b+ v) b
8 e; q' L1 I, B, z& V例如test.tar.gz包中文件情况如下:; p! }4 J9 I/ ~( ^8 W4 g
1.txt
, ?  c! @& _- a" x6 Plog/
$ n6 I2 P1 W- g, a9 \1 @& a) m6 t3 Xlog/1.log
: M2 G* l4 q8 J, A/ E7 J' jlog/2.log& S! J, f* o) K. m
log/2.log
( j: K$ C' z$ X, D& zlog/4.log) G, K- }8 }( N% v
log/5.log
3 f4 S0 _6 U2 K+ Z# a5 F如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:3 s* Q, t2 ?6 v5 U
tar -xvf test.tar.gz log/1.log& l' k2 }6 R. _0 p) g9 U8 s
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
6 r5 o  B( U1 ^* ^2 A9 e解压时去掉目录结构9 P% \7 J% ~. t1 m
/ s7 O7 ~! R2 F1 n2 e
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):" G! Z- k+ S  P7 P; h% c) I
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录9 z4 ^+ s4 _  L. Q3 P
解压时不覆盖原文件9 ~( G) {, K- h! E

, I' y" L8 Y9 I) o当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):0 j3 Z( S) H9 G
tar -xvkf test.tar.gz
/ U1 J# C- `$ p& h$ {( d; F特别提醒3 u3 H1 D" q3 y/ _, I$ B
, J& h* F' p: l; i0 z$ m
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。' I9 J3 n" t9 d1 K7 m* g
zip/unzip
' z2 C* r/ Q: `! x! C% H2 c  q% v. E2 F2 n8 ?$ \3 ]
zip和unzip命令主要用于处理zip包。
% @7 t* |# {  J压缩
: d7 x% g  A6 H. n+ f% p
$ v# W$ M* m2 M5 f. n涉及参数说明:# @0 d7 G2 M/ @$ `2 D4 _
-d 从压缩文件内删除指定的文件。! f& I6 v2 M& O# b+ o0 k
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
# K( |- b/ {2 U-j 只保存文件名称及其内容,而不存放任何目录名称。
# Y. q' r* c8 ~1 K' B" G-r 递归处理,将指定目录下的所有文件和子目录一并处理。
  q) |. N5 g/ C9 c" }& \) Q1 C-u 更换较新的文件到压缩文件内。
$ h" R: d* P( P4 E0 T+ _! ]-v 显示指令执行过程或显示版本信息。
# m) {9 R) {1 o. L4 G-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
8 z  h. z" O4 M6 O: \" Q) F- <压缩效率> 压缩效率是一个介于1-9的数值。
+ m! c1 c1 M( R7 l, n压缩文件
* L( t; N. |7 X/ B! [
- Z# k/ v) E# V" P1 [4 }zip -r test.zip test/ #打包test目录下的文件7 F- X$ s# \& E- x) [; C2 _* s$ A
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录0 _9 X& R; L$ `7 C! O8 c
指定压缩率打包文件
" I" G6 T. ]. W. m5 y/ M' ]" w& e0 G% ~, U
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长) g, v/ P* t. Y* ]2 G
打包符号链接文件$ D1 O9 U$ y; B" z: N$ L$ B) O
3 U3 V4 a$ j; Z) q
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:+ `4 m5 d9 K/ R2 X3 v
zip  -ry test.zip test
1 o/ A& B& C7 [1 q( H向压缩包中增加或更新文件7 O& }$ F& e3 w, t
" x- J. K3 J! w# F
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:( v4 P! O% @6 N& _2 A3 l
zip -u test.zip test2 #向test.zip 包中增加test2文件2 a& T( j  Z+ x
压缩时加密7 \. j0 n6 {* |; s: ]' V$ ?
' o* [/ z, K9 V$ q& C0 P
压缩时如果需要对压缩包进行加密,可使用-P参数:
8 y) C, ~& ^" _zip -r test.zip test1 test -P 66666 #使用密码66666加密7 b5 h' S6 i2 k) N1 T2 O' |6 c6 M
删除压缩包的特定文件
7 X% G1 U" [/ k/ g  c$ o3 N
. \0 a$ `+ R- c& Q$ k+ y6 K6 Uzip -d test.zip test  #删除test.zip包中的test文件
7 a* `5 P- K; B: Y; h, Z8 D解压: _& q7 U8 z6 f/ i3 N4 |! K4 q- E

& |* A1 Z$ u, r% E涉及参数说明:# T% N- }6 ^' c/ j
-l 显示压缩文件内所包含的文件
4 p4 d* M5 I) d. i$ j# q4 C( ^-j 只保存文件名称及其内容,而不存放任何目录名称。
- S4 G* t( X5 Q0 E! T-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
$ `: [' z: _2 Z3 ^-v 显示指令执行过程或显示版本信息。
' v+ Q  y* h" T) `, M-d 指定解压目录,目录不存在会创建
- u# W# J$ a) E' g# H' ?. X) ]查看压缩包中的文件信息
. z) W$ d  @9 E2 q9 K% a/ F4 w5 m6 D: E
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
! F# ~* ^9 c* \% S2 X4 p) |unzip -v test.zip #查看更多信息,例如crc校验信息等! _" G% @/ `* j  n0 s
解压压缩包
8 k" B9 k* a2 |# L; r1 g: R
& @0 T. O' N6 }9 V  U* iunzip -o test.zip -d dir #讲test.zip解压到dir目录
/ A+ R/ S% _5 m) O解压包中指定的文件/ }/ o" i9 v1 R6 T! [
0 Z, P- {# N8 o
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
/ d! Y9 F! y2 k/ @unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
! w  P! K) R+ B7 F7 Funzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件0 H0 c8 O) O8 Z6 h1 @% y. A/ p1 K5 Z8 f
解压时去掉目录结构+ q% Z. S5 F7 Z" Z! k0 f- f, D

7 X) M& E' g6 U6 R压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
0 E7 O5 D  N$ ~2 D. }zip -oj test.zip -d ./temp  ' L% `& ^# J7 g7 q/ q2 ~- u. R
解压jar包* G6 t& D1 E( [9 `. k
2 V- Q" p9 G9 B# D: H, N, X
jar包是java归档包,但同样可用unzip解压查看里面的文件:/ p) W1 e# l1 c7 C
unzip -o java.jar -d dir2 b; J* v1 `, l# Q  j# K( z9 r
gzip2 @& I+ H* c5 z: \1 b. v; `
+ m8 j/ @: }8 j
涉及参数说明:
; S! |+ w. j; A9 d7 B7 |( c  ?! c) h% ~-k 保留源文件
  b) y% G; H7 e) }+ A0 h-d 解开压缩文件
6 u  D' j9 i# o6 K3 ?: O' V; N-r 递归处理,将指定目录下的所有文件及子目录一并处理
) o3 ^7 G% I6 `  f5 h-v 显示指令执行过程
* m# U8 F- x) d9 _& \$ [9 }tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:6 [5 L% Q. R3 P  W! {7 q
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
" D$ \- o8 ~0 \8 w4 }+ X8 hgzip -rkv ./* 递归压缩. a1 T) ^) {$ u7 u% r& s' N2 ~
解压也很简单:3 ]: s! b3 i: J5 W, l
gzip -dv test.gz # C/ S" d7 Y9 o, g$ T6 T( {
bzip2) F3 X4 \' A$ N- g
* ]% z: p0 S% }" I9 L8 {% P
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:) s  G, g+ D, p! m, g
bzip2 -zk test  #压缩test文件
5 c; p% e8 e- _9 ~bzip2 -dk test.bz2  #解压
' c. c0 e: L7 o7 I, M' Rrar/unrar7 C# l0 Y6 ^' i3 Z/ R/ \) Q; c+ S, M

) [5 m) E% u0 m- c1 Y$ Frar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:( m* h: a* [/ H) S
rar a test.tar test  #将test文件压缩为test.tar" c2 G4 ^0 c# b, K
rar e test.rar       #解压test.tar) h' T# j, ~9 \0 ~
unrar x test.rar     #解压test.tar4 m2 M  a5 J2 A  e( d2 @
压缩率比较0 x; t( \8 b  p) H  S

' B) o/ h& e7 S$ i  ?" c% ?压缩率一般来说:6 O) O' W; `$ @4 I
tar.bz2>tar.gz>zip>tar
, }3 F% h& J0 ~& E; _  p压缩率越高,压缩以及解压的时间也就越长。
# @' M) ]7 P% n0 I总结
0 Y& N/ ]' U5 v4 m9 o; \: y' v% H3 j, B/ C& u" [/ G  ~7 T( G4 x
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。$ \. ^/ g9 ]! L) Z, Y2 K
有任何补充或建议,欢迎留言^_^。6 i1 {. q1 n3 L, C( j4 Z6 A+ E8 V9 c

6 e6 `% F, f5 _# H5 _% d4 g. ~: v' g
7 g! l( d4 n) M7 y
% E9 A: L* _8 C% P' |5 A7 S
# q7 u( k6 a: d. C* @) X/ O- Q

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 09:06 , Processed in 0.068330 second(s), 32 queries , Redis On.

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