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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

9 ^0 f2 x: e9 @1 K( M2 z( r
' u# B5 J5 T' M! }8 O
" k7 z- e/ Q+ x& G3 ?7 z
前言1 B* R1 u7 N" B  K

6 j9 I5 p* F) m1 a, U4 ZLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。& w7 M! y) J8 l, E
tar5 T: C5 K8 s$ i+ x

7 u7 N, B; u: I) C9 qtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。" n0 c+ I- L' Q- n! f2 Y
涉及参数说明:
  t3 l  F3 p' B( o: }
-c 建立新的压缩文件; Z4 j7 w4 l: R0 P! h  _6 r
-r 添加文件到已经压缩的文件
: f0 ?/ M0 M0 J+ K# b-u 添加改变了和现有的文件到已经存在的压缩文件
, j  J, S5 P" ]-x 从压缩的文件中提取文件( X/ i+ T6 r3 R: ?1 G3 k! {
-t 显示压缩文件的内容: `# i- N  J. t  h' ~0 T5 c! y
-z 支持gzip解压文件; d( y1 H/ S7 E8 ]9 j3 n" h1 N- A
-j 支持bzip2解压文件
' Z/ o( g/ k! S$ M-v 显示操作过程& q1 Y1 {! u+ o! y; [( o4 w
-k 保留源有文件不覆盖* X% k5 V4 @  _6 s+ C
-C 切换到指定目录" `/ v$ E- o5 @8 a! @( _
-f 指定压缩文件  j/ P3 j5 T" Q

6 b% [. O( S2 b2 Q/ W--delete            删除包中文件# O$ d& A- {6 j/ ]! e
--strip-components  去除目录
5 k! d: ?# ~0 ]7 p" Y--add-file          向包中添加文件
$ _/ F1 |7 i, U% ]7 T0 @+ G+ n0 g压缩
; ?* z( F8 R) T) c  X, ^
5 J6 l  u% X  h! z归档tar包,不压缩
. {0 k! F+ v$ u
/ P8 _- W% t$ w; I7 u( Otar -cvf test.tar test1.log test2.log #归档多个文件
3 n, e* j) a8 Y, q2 {( otar -cvf test.tar test/*  #归档test目录下所有文件  E5 r& j9 }4 T
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 7 B, q% s5 u2 e3 C; e
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
/ w& K. k7 ~3 G; C- X* I. s$ w归档并压缩为tar.gz或tar.bz2& \, d. G4 r, R% p2 d" e5 B1 M' K
: o8 }! n* X- T8 M
这种方式打包对文件进行了压缩:+ h8 Y- q4 m! x
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
6 E' w2 n/ h: f1 ?# ]tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
. w/ C  I2 W& |查看压缩包中的文件
0 X+ ^1 v- B- _# |! B
, U3 j: q7 x# R8 H& e0 c) a2 Y如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
& t- W0 o3 o7 h, T! E6 V. u' Z4 ^tar -tvf test.tar #可查看test包中有哪些文件
, H$ R5 S) V2 G; E打包后删除源文件/ R5 l! U- b) t7 V- |
, R1 ]+ f& Q1 D& Y
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
, v+ P( ^& |2 d3 wtar -zcvf test.tar.gz test.log --remove-files + P& p: ~5 x. ~3 D  R2 U
打包除指定目录或文件以外的文件- N0 P+ _2 f0 `+ X* v/ J
0 `' C7 q7 A+ X( X* Q9 \
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
) b' W9 k; s: |( {# S0 dtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件9 w- g+ g; q0 T, w: n" U
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
# I* ~) Y0 D  m2 z向压缩包中更新文件6 ^" }6 G) }8 X  |

- O1 i+ F6 ?+ K0 R9 |* T  p/ c( z例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
9 f+ u0 d2 L' T' E. ]0 F$ s1 L, ptar -tf test.tar --add-file=test #只针对tar包
/ g- S+ e7 S1 T' Z( a0 C向tar包中增加文件
2 s3 r6 U2 {4 X; M2 c) H! N) R5 c; L4 f! g( u$ o; n, ]
向tar包中增加文件可使用-r参数:* J0 b& t: [) q! \' h' E
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar% _* P/ x7 M. \( w2 J$ T: [
删除压缩包中的文件
9 o% i; k1 n: ]% G3 X2 h- G
% ~% h+ L. W3 b% n在不解压的情况下,可使用--delete选项删除包中的文件:* G* e7 E+ t+ P
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
8 k! W/ l) t+ H: K- S7 A  G5 S解压  x% M; s/ o5 M* V; q

6 l# P. v7 o$ r. [解压tar.gz和tar包到当前目录
' y) L0 i. S8 Y
! W7 h9 z  C3 C; Mtar -xvf test.tar.gz  a3 Y& Q( ?2 z5 V( s
tar -xvf test.tar * ^# \) O6 @9 z
解压到指定目录( P. f; e  v! p6 v# j0 o* J

: e4 F; H6 {! x0 g$ _# [tar -xvf test.tar.gz -C dir
" S/ }) d6 V; q+ \# y# Etar -xvf test.tar -C dir
3 N, s, u- ~0 [# P4 P  W解压包中指定的文件; ~, E; P0 J. }6 P% o
0 e6 O) ~2 H0 x$ @9 s0 C
例如test.tar.gz包中文件情况如下:( [3 {9 g# ?" W. C- g
1.txt. E$ E  Z3 Y1 y
log/  K' D- i! e8 N( K6 R& m  K
log/1.log- q/ i- }, j  L6 P- X% [5 ?- }
log/2.log
$ W5 O/ c5 J; ?: _" Q' Qlog/2.log4 |+ G; e7 N( z5 v: B5 ~# V6 ]5 t
log/4.log) ^0 I6 i7 D/ p+ p
log/5.log+ u) m' I! O4 I* H7 K' j
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:9 b3 x6 V: |& f0 f8 q: J
tar -xvf test.tar.gz log/1.log4 _0 U5 M6 k3 `
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录* d- s( ^6 Q, J3 s; T: a
解压时去掉目录结构9 S6 `1 w; `# \. b2 i* W

! k3 U3 b% q8 B0 e压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):7 q! m8 b5 ?! L" ]; A
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录4 R/ g# o3 l4 w/ s- B/ d
解压时不覆盖原文件4 T6 W* b. n# m1 {8 C) O3 G; g9 r" p, s& q

; ]: x& e! h+ x当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
- V/ k) {2 O' X" [  ]/ _tar -xvkf test.tar.gz; Q$ b+ t( H1 b# E/ G' e; O3 W% j
特别提醒
8 O* c+ y/ {% x* e% F; G, _
. v% W" Y  u/ D1 Z* Y* |前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。, D4 M7 H7 a& H. Z- [0 U
zip/unzip$ b" `' b; f* h( S  Q7 Z
3 U6 D; Z! M2 E
zip和unzip命令主要用于处理zip包。& q8 r# w' x2 m$ R; e3 U, ^
压缩6 ~" b- d% a7 r, U1 a& o0 Q
1 E6 s% t$ s) Z/ s# f$ E; n9 J
涉及参数说明:
; I: \+ X& Z1 y! k* g. o( {" H4 T-d 从压缩文件内删除指定的文件。  J( u% g/ W; p+ i
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。" B, p3 ]- s, A% n
-j 只保存文件名称及其内容,而不存放任何目录名称。: w2 A! k# {5 R+ W5 U
-r 递归处理,将指定目录下的所有文件和子目录一并处理。$ p! K  R2 [0 u  K
-u 更换较新的文件到压缩文件内。
8 R; t$ m* b8 M- G8 T8 ?! ^-v 显示指令执行过程或显示版本信息。9 y2 p# j' p* a; @/ }% j
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。7 C* T& Z: M; n
- <压缩效率> 压缩效率是一个介于1-9的数值。
  ~7 o5 m3 E& g! l压缩文件! R: |9 ]4 o6 k4 v
! h  q7 k! W5 t& {
zip -r test.zip test/ #打包test目录下的文件
( B2 W% y) S; `6 ?6 Nzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
, ]) D+ J5 B: E( ?7 Y8 ]指定压缩率打包文件( r( {; O/ l4 N

6 \% H; H9 m7 o/ L: x0 b0 C, v6 rzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
1 p+ v- E$ _; Z- E打包符号链接文件/ ?/ ^+ V4 F3 F9 x! g1 B2 J

! g. t6 [0 ?. o5 U" e* K" }% c6 Z前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
+ k! n7 `, m+ F2 Y5 C; M* Izip  -ry test.zip test
7 Z7 r; e2 j. T( _向压缩包中增加或更新文件8 W6 @2 ]' Q, c6 S& X) l8 g4 I9 ~
# s- L9 B2 v9 j% m. \$ ~! I
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
6 a' V6 E; W% k  M0 Azip -u test.zip test2 #向test.zip 包中增加test2文件* F" x: M% X; N0 B
压缩时加密
3 {" t* b7 T3 G* u; X% R1 f7 }" L& ?; |
压缩时如果需要对压缩包进行加密,可使用-P参数:! l0 I- p2 Q' Z+ Z, ~, Z9 R5 k
zip -r test.zip test1 test -P 66666 #使用密码66666加密
, J3 j/ d. k  e$ _删除压缩包的特定文件
6 n1 a) u( J8 W
( I- M+ f" ^0 d+ X* yzip -d test.zip test  #删除test.zip包中的test文件5 I. l5 j& c% B8 @# x
解压/ M0 s" c; l8 z$ {, I
0 T  d9 X4 c" W* G
涉及参数说明:
5 l$ |, l2 u7 f3 _9 O% G2 {-l 显示压缩文件内所包含的文件; @. d" t3 D+ B8 E3 ~% M
-j 只保存文件名称及其内容,而不存放任何目录名称。: Q& {! {! ]# F4 U# ?8 C& J2 n# \
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
! \# T6 }& c! d2 E-v 显示指令执行过程或显示版本信息。; L6 e" R* \1 E2 `& i- A* v
-d 指定解压目录,目录不存在会创建' {4 i' Z! j/ f1 P7 l
查看压缩包中的文件信息
- \; |+ i  ^5 t$ F+ v
8 ~( D! B& F- I4 X: l; |, j2 ?unzip -l test.zip #可以看到压缩包中的文件名,日期等信息; y0 e' a+ i6 d1 O4 H
unzip -v test.zip #查看更多信息,例如crc校验信息等
" \. d0 d: D# L3 N: I& F解压压缩包
, g# B/ x/ }9 Q, Q1 U8 Q8 ?4 |8 V0 U; J+ N2 w* D* @- Z
unzip -o test.zip -d dir #讲test.zip解压到dir目录# G/ @6 j$ Y  O4 l9 I
解压包中指定的文件; B/ p& y1 S4 b* E, ?

! s% R  R1 J! Q0 q" h( V! j如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
% ?  Q! z0 }; ~; @unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
& B5 S5 K: M% F; x$ Bunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件2 r: U" p8 j5 A" M3 z# c
解压时去掉目录结构; b" K0 {! h" o4 Y: q8 W

5 S% L6 _. g; O- \压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
2 B" c4 j/ j$ Q0 H# dzip -oj test.zip -d ./temp  ' a. u! {+ T5 e
解压jar包
2 S% m: \. K/ N! k0 k! h3 M
! o0 q8 v/ X* q9 Ijar包是java归档包,但同样可用unzip解压查看里面的文件:- A# U4 F3 H8 B9 a! N
unzip -o java.jar -d dir
) E* Y4 f; T) \, {6 P' l, R$ Bgzip2 l* G& p9 m. [; _

0 x( _# r1 C! ~. X% z3 k' O+ L, Y5 ^涉及参数说明:
% k2 \* z# x$ Q2 y8 D( D2 o5 X: ~' p-k 保留源文件7 \! L7 }) R; p: ?
-d 解开压缩文件
$ e  {3 j' l6 m9 q-r 递归处理,将指定目录下的所有文件及子目录一并处理
0 k( C% u2 o  \) x-v 显示指令执行过程/ ]) L$ y2 C% }7 n
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:; V) A# p7 w; ^/ L4 j" o
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包5 _/ l8 \5 H  J7 J
gzip -rkv ./* 递归压缩/ _* J% V2 ?  y+ m- O
解压也很简单:" y5 H; A: b+ Z' q5 ?; T
gzip -dv test.gz
2 Y3 x* f4 b# M  V5 G) fbzip2
3 q6 q) E0 m; |! S
: M+ u4 k) G7 Star命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:( X5 O9 V* B/ t& C
bzip2 -zk test  #压缩test文件
5 j& N' ^0 W1 e7 r' c2 dbzip2 -dk test.bz2  #解压
' Y8 m9 q3 I: Irar/unrar
2 t7 x/ m  W& D2 D1 h0 O7 f) b9 W# C* S! C
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:4 M0 M, q3 _5 @
rar a test.tar test  #将test文件压缩为test.tar
$ W( `4 L  N) yrar e test.rar       #解压test.tar$ ~) ]/ O- {4 Z- H) ?  x) \) ?8 @
unrar x test.rar     #解压test.tar
5 P) C0 o* z6 b  W& g8 N4 c压缩率比较# S) [9 o% f9 `2 {
% |$ O& f+ x- h/ _6 P
压缩率一般来说:
9 f8 j; U3 g; [tar.bz2>tar.gz>zip>tar
% s/ Y( l; D: N* ]) B0 r压缩率越高,压缩以及解压的时间也就越长。* c: _, @. Z9 T( P* R* V4 I
总结5 g+ r8 @, e. t) U# L

9 `+ F9 B3 s0 ~对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。) d0 P" t* y, N, E' P7 R
有任何补充或建议,欢迎留言^_^。
! W0 J- f3 H( L+ L7 n: J
0 s& c/ _: [8 G  T0 `" h, b( Q! G1 J3 l5 g) r

2 i+ z1 u1 {8 B/ R/ n9 b, Z

0 i2 \% Y# q% E' ~: C9 O

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 03:54 , Processed in 0.062238 second(s), 32 queries , Redis On.

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