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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
# V5 B" L7 t! k' o

+ }. v. Q% a3 J& o9 z

+ K1 J# A7 v6 f- B- p前言7 j! |8 E0 S2 k0 C

4 w/ U; v' }8 g" w8 O- h' dLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
8 k% N" ?7 H+ e5 c4 d2 K$ ttar. G( c6 ?3 b* T2 u& `
6 O! l6 v8 y6 ?0 |
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
# K1 S0 d* I7 |% t, U! n涉及参数说明:
: Z8 n9 I: S0 e* X
-c 建立新的压缩文件
3 Z/ ?  {+ ]( p  O4 j-r 添加文件到已经压缩的文件/ l  \4 e3 Q$ i" @9 J6 l
-u 添加改变了和现有的文件到已经存在的压缩文件: S7 n$ K% V! n) \9 b1 E- H; @
-x 从压缩的文件中提取文件
7 v8 g8 L5 B9 s  p& C; w5 M-t 显示压缩文件的内容
* z7 r0 S4 j- A3 ]0 i/ i) h-z 支持gzip解压文件/ b- E8 Q( c& P* z% C( H0 |
-j 支持bzip2解压文件
0 q; [. p" u$ P3 j-v 显示操作过程3 O" m0 L% p4 N. o" v1 d
-k 保留源有文件不覆盖
, `% r! g' l! X1 ^% B$ t% X-C 切换到指定目录9 C" j+ ^( F6 Z- @) U3 \
-f 指定压缩文件
, A  J- n* S, P3 w# [
& {% I6 l) E- ?2 F7 I  G--delete            删除包中文件4 S; m- [' l/ ~' k) N% ]/ q4 t" |) d
--strip-components  去除目录0 f8 ]% C4 p: O9 v3 }
--add-file          向包中添加文件! v8 H* t; a8 z$ }0 u
压缩
7 {/ z# a: J; T( v4 M0 t: B% p9 ~" b3 ~8 @8 Y
归档tar包,不压缩
6 x1 [: u- Z: P/ {& r; G6 n# \9 s; C( N0 H
tar -cvf test.tar test1.log test2.log #归档多个文件. \! k, Z! ?! c5 P
tar -cvf test.tar test/*  #归档test目录下所有文件
7 o: H5 H1 y' g* @0 ?3 b" z. _tar -cvf test.tar *.log  #归档所有以.log结尾的文件 6 t7 E  y  H" m' X' F" [7 `6 \3 c
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
. P& t6 D! }6 H6 ~+ u归档并压缩为tar.gz或tar.bz2+ @; W" s( C2 i2 K3 t$ E
( z+ M  X5 r# A* W9 U4 M
这种方式打包对文件进行了压缩:
8 b) Y* e8 S" @- M# jtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
/ B! R! h. C$ T* O3 Qtar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩6 M- e' b4 m7 i) m: ^. B  {
查看压缩包中的文件! U; n" B3 j0 `! @
- I# p7 U1 j1 O+ X( Y" G' E& c
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
- S5 |1 p: P& V$ Z- @2 Mtar -tvf test.tar #可查看test包中有哪些文件6 [7 \. {6 F/ K: h" [* ~& z
打包后删除源文件
4 J/ c3 q2 K* e, n8 m; R- F) s4 J0 v" e5 T' K# Z# o0 c+ Y
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:' ]* Y5 g* q5 ?* E. O6 ]- X( w
tar -zcvf test.tar.gz test.log --remove-files
# d6 K& U. q8 q  }8 }/ I打包除指定目录或文件以外的文件
  Z& c: [5 L6 m& a/ _4 f9 n( p/ p( V, l, e6 j2 J/ m
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
2 a8 n9 T* ?1 d5 L2 ltar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
) M6 ?' ?' o9 a8 _* ?9 M, @& {这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。6 d# Q! A+ ?4 o4 @
向压缩包中更新文件5 ~: \5 M! X# ]& @4 j" A. G

9 @8 @' |& E% L0 a例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
- p5 b8 f# S9 ~tar -tf test.tar --add-file=test #只针对tar包
+ S: H% B: Q) i% i' C向tar包中增加文件
, T  M+ ^7 Q1 `6 s; r% W  _/ e
" c  O5 W4 `: }  p4 C向tar包中增加文件可使用-r参数:' B$ i/ U& P2 U2 Q6 E/ F0 R# t
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
; |9 b( c% X6 a/ S3 X& e删除压缩包中的文件3 r$ S9 [9 u+ T# J6 A6 y& F" p

7 g9 ?( E& t0 X) L* S4 {$ O- s- Y9 x在不解压的情况下,可使用--delete选项删除包中的文件:
; Y8 K" N7 q( m! |/ n7 Dtar --delete -f test.tar  test1 #从test.tar中删除test1文件
& k, E& }4 E( x0 t6 P解压
/ h2 H9 s) P; [# _. Q* Y! f2 K# q' S" ^9 p# O0 Y; a$ L2 d/ I
解压tar.gz和tar包到当前目录
, I% K2 m/ e; @) H' a9 E
3 r" F3 F7 W+ k! p7 C- n5 Ftar -xvf test.tar.gz: @2 t9 R9 Q; {2 V
tar -xvf test.tar
5 E3 Z  V, A' ]! S- @3 ?7 `解压到指定目录
* G/ B2 m; F% v: n. I, b% p
  J, h# G! H9 X& R7 F$ ^8 e0 H' Rtar -xvf test.tar.gz -C dir
: d6 L. u3 I. P' Htar -xvf test.tar -C dir& `9 D& l( E$ ^& T
解压包中指定的文件
" |/ J2 M1 k% X2 Y) Y
! I9 o/ y7 P- Q" E4 V例如test.tar.gz包中文件情况如下:3 I5 x- j/ k* b! ]
1.txt0 B+ Z" \- C6 E3 t. i6 H) `
log/) t5 ?8 C; \% O( D+ x* U, r: U+ J
log/1.log1 V* H$ s( w2 t' {
log/2.log& ^1 m: A2 N: g: ?" |! M+ ^
log/2.log
) ?4 H7 t# F$ n# [, w8 `5 `log/4.log
# X' J9 f  k6 Y% v7 s; O/ dlog/5.log7 `% |! M1 ^7 a3 L8 T/ c5 J
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:2 {! r# F& h  Z% K. s
tar -xvf test.tar.gz log/1.log
& O/ q1 i1 T( ?5 {8 U3 c1 s, mtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录+ C: K1 V: Z7 }- v: i
解压时去掉目录结构
# ~' W0 }0 V9 L- q
, \2 V3 O) s- B  C5 z+ O! M' b压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
7 x$ g& x0 \1 k. V1 D# P7 z- ^tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
' O& e, P: V; w- p解压时不覆盖原文件5 p! f% I" {" G  w- s& l: I

; L% m, g( {1 T- S9 }! R1 }当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):% s/ Q+ o/ N1 c4 c% k( U, E, M7 ^
tar -xvkf test.tar.gz+ K2 p+ \, T" u4 m4 e
特别提醒
" Y. p+ J3 a3 R. Y9 ^9 J0 E! Y# e% A- ?
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。' r4 |2 x: f+ \4 Q0 _9 t# f
zip/unzip/ q3 G/ t, O# T
0 ?9 G7 I0 ^: S! T% y& ?: ]
zip和unzip命令主要用于处理zip包。
! k# a6 A5 n+ M6 k压缩3 N+ O/ v7 N* D3 h9 B4 g

+ ^! E1 d4 P) g  t+ K7 q) ]# j7 U涉及参数说明:
1 l) R. C4 W" s: g& h* a-d 从压缩文件内删除指定的文件。
+ @. W! L8 X9 Z/ ^! A% \5 |-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。+ _0 C- [# g/ c
-j 只保存文件名称及其内容,而不存放任何目录名称。
9 P: L/ ~, _# q  E; I& d-r 递归处理,将指定目录下的所有文件和子目录一并处理。2 `: \; R$ G1 `3 ~& M
-u 更换较新的文件到压缩文件内。
3 O! P0 ~9 N- _( N/ _. y5 C# W-v 显示指令执行过程或显示版本信息。
0 w  O3 o' l) |& p-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。$ @  q8 ^" `% |2 p
- <压缩效率> 压缩效率是一个介于1-9的数值。
$ m5 X/ I' g1 M% x4 g# G! I压缩文件
/ c, w* p  A! ?8 s5 m9 X  ^  x
; U$ }, f/ m* X3 uzip -r test.zip test/ #打包test目录下的文件
+ E( v& K# |) q! s! Azip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
$ b2 Q$ s/ l8 a$ G4 N. V( m  |0 E指定压缩率打包文件4 Y: v3 Y- Q, i0 l+ i0 ^
# _* O+ C9 S/ M. @
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长! u4 o3 u5 h- {1 ~7 Z6 t$ f& t0 b
打包符号链接文件
+ V3 ?% v6 |4 Z* N, q( d, o! D4 C- Q) }' c
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:0 h; {: Y7 u; N# V; g  V) y9 {  T6 s
zip  -ry test.zip test0 t- T5 O9 S! _3 |" ?
向压缩包中增加或更新文件6 m- x$ Z& G7 ?: B1 f. S" w

$ X* r& M; T, }. F有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
+ T0 R: b5 u1 l5 K4 z6 |zip -u test.zip test2 #向test.zip 包中增加test2文件
) d% o1 m4 ^+ h- R/ j压缩时加密
6 m: H7 l$ @) z0 o8 u/ a; F- e3 q5 A8 @3 z/ e' W, Y1 S
压缩时如果需要对压缩包进行加密,可使用-P参数:) _1 s# j$ k9 W; q5 g
zip -r test.zip test1 test -P 66666 #使用密码66666加密
+ S- G$ ]3 H9 C删除压缩包的特定文件
3 P1 I7 z) a6 H8 {# y/ y# N. n( k  M; S& M
zip -d test.zip test  #删除test.zip包中的test文件
4 |' w3 g) q& o' @% A: V解压! I- Q% ?; ?7 w- U- Y. C; i, b7 v

) ]# z/ I' q# H: b% K涉及参数说明:/ @9 x3 S; q+ d0 I
-l 显示压缩文件内所包含的文件
0 V+ A0 }0 p3 Q: B$ L3 f3 [  E; T-j 只保存文件名称及其内容,而不存放任何目录名称。
) A- `, X9 Q2 r( k. s  A-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该- S% j; d$ ^7 F/ |5 j0 y7 z
-v 显示指令执行过程或显示版本信息。; }1 {. o5 j9 N9 t& ^
-d 指定解压目录,目录不存在会创建% f! m5 p: @, ~1 o
查看压缩包中的文件信息6 A3 X! z+ Y5 L# v

8 O9 M* ^% M7 H) W2 N* Eunzip -l test.zip #可以看到压缩包中的文件名,日期等信息! f2 N, J" @! O
unzip -v test.zip #查看更多信息,例如crc校验信息等
' p! a7 R( U$ l7 W( E解压压缩包1 b8 r" Y$ L& k" y, g% W

, ~0 c+ H. m* e/ n9 q- @unzip -o test.zip -d dir #讲test.zip解压到dir目录
% W3 r, T2 e0 C解压包中指定的文件
6 K2 T, {' D9 z+ C) ?) }+ a
( s: a, Q) K" m如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
: G3 U& R0 W! aunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
3 ?5 q% ?9 _  a5 Funzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件& z0 D5 x' C' P  a- b" y& \
解压时去掉目录结构4 |9 i. K& W, \9 E  v8 }

# s# {! X% ^( v+ @1 s3 L" j- i* D压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:& u% U9 b2 I5 N5 k6 b4 N& e
zip -oj test.zip -d ./temp  
# e3 L7 C  _% A$ R- c解压jar包) Z+ A# l1 A2 A+ Y
6 M5 U) P, `$ N
jar包是java归档包,但同样可用unzip解压查看里面的文件:
. V& y6 Q# D( M/ g* q5 ~& Aunzip -o java.jar -d dir
. T) f/ ?3 b1 j( s% ]; ~gzip8 j9 n9 R  W" ]1 O! Z, c' j: `
+ C4 Z$ B; u# e2 {& D! i6 A
涉及参数说明:
. s7 m- B1 m2 ^-k 保留源文件
1 I( n& i4 h$ [- n-d 解开压缩文件
+ v" M/ ?0 ^% O-r 递归处理,将指定目录下的所有文件及子目录一并处理: o1 M8 G6 P2 R1 `0 \+ l) @
-v 显示指令执行过程
5 c* A: T( J; x5 ^tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
$ ^! W; u7 k/ i) I& f; r% B" Wgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包& e0 V& h, H0 l
gzip -rkv ./* 递归压缩
3 r0 }9 ]% n, u8 }# g  C8 s解压也很简单:
1 O! r  C  d) Wgzip -dv test.gz 5 x) {8 S: D1 \- D
bzip2
* r. k3 \' o6 t2 U/ d
: K4 d' i! z) U9 @. o, ctar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:# q1 @6 c5 L  x
bzip2 -zk test  #压缩test文件+ v4 L* s9 m4 z) Z- N6 j9 G
bzip2 -dk test.bz2  #解压5 u! I, B# W; |4 B
rar/unrar, p* z+ C% u( ~* E: D& X% K8 s
' `7 c; l  m3 d  \. R- u5 z! Y: B
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:) [* f& Y0 K  V( n1 Z
rar a test.tar test  #将test文件压缩为test.tar
. ?) q# D: G/ nrar e test.rar       #解压test.tar: r: @0 _% x% a# C- n, |. T
unrar x test.rar     #解压test.tar9 a; q3 j. G7 _, E4 q1 E
压缩率比较
. f0 |$ k( P) x5 K# o, |9 W3 \+ |$ ~5 w7 N/ [
压缩率一般来说:
! C/ O2 k4 v: W  n  Itar.bz2>tar.gz>zip>tar
5 a3 E9 ]7 m+ t4 N" X5 Q2 N$ t压缩率越高,压缩以及解压的时间也就越长。# K# z6 ^. S; ^7 z. o/ S
总结9 W. g( l/ B; k, x

' h* e5 q- t5 L: x: u对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
# ]& J  e) y; M8 X有任何补充或建议,欢迎留言^_^。
$ q! l; Q8 L4 x# F- ^6 x( o7 }2 N1 w
* i, z* d- K6 x" F9 W
* {  ?! K( z# m2 w8 N% }6 V
7 C) s$ R) Y% u

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-16 16:39 , Processed in 0.055711 second(s), 32 queries , Redis On.

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