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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

& ?& W+ n, @: N0 j
) C1 U7 T" o  K& p5 A

( a6 L; _/ f- E2 j- `1 O前言
; r4 m& j# R& J' i- {  S, ~+ z) X0 |9 C: Z
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。5 Z5 ?' p% K# f, |% l& T
tar; ~4 W9 H( b1 O5 Q1 p
. N* X( G5 v- L: A5 \5 w# _
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
! L9 H# Z2 T& k2 p* E$ H0 ~涉及参数说明:
6 X0 z! f/ M, W( e3 i
-c 建立新的压缩文件
, s5 U5 E0 Z* n-r 添加文件到已经压缩的文件
8 [- a' n- v: m, R: L-u 添加改变了和现有的文件到已经存在的压缩文件
+ [. g6 E# B7 x$ T  G-x 从压缩的文件中提取文件
# e6 ?$ s, \. p9 V. d' V6 f5 s! {-t 显示压缩文件的内容
6 j2 _# h+ ^* e3 K4 S7 z-z 支持gzip解压文件4 Y8 o5 L0 l7 o# Q' e4 \$ \
-j 支持bzip2解压文件0 _' D* b7 l& `; S  h" A
-v 显示操作过程9 o" O( `! D2 w& k; F
-k 保留源有文件不覆盖
3 k5 F/ i% b# u8 U9 ~5 m-C 切换到指定目录
3 X: T/ {* [. s/ J) B2 n8 Q. L-f 指定压缩文件2 V% w* n2 p! n! Y% u. M5 [  {# V
  p. Y! u2 c% n' b7 c
--delete            删除包中文件& k+ W8 U: o7 O
--strip-components  去除目录
4 e$ D& ~; ^, ^+ z, J--add-file          向包中添加文件6 m5 t$ O! W6 f% w2 f' @
压缩
& H7 `# Q7 C7 }( p8 i/ _( e% U/ h1 r; M; z* i  B
归档tar包,不压缩
8 s; H- F' h: k3 d  S9 U9 l" x/ u+ ]% t# @# j' q
tar -cvf test.tar test1.log test2.log #归档多个文件
9 F9 s0 W9 Z2 m3 ptar -cvf test.tar test/*  #归档test目录下所有文件5 ^5 s/ F; l$ A: z+ _  N
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
2 V0 B( U" j1 {, @, e0 u由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。+ e6 i& ?  R  D/ T4 P1 \, j
归档并压缩为tar.gz或tar.bz2
9 ?0 i' j: y* l1 V. {
1 u2 C$ ~, _5 E3 H! w0 _+ z; r+ n这种方式打包对文件进行了压缩:
* l/ k9 r& G5 Y4 [0 G. ptar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩- R  l) M! ]7 c% N
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩8 g& i$ b( S; j
查看压缩包中的文件
' d, v( h* @. g1 N3 x$ Z
; v& }" O2 T! R* d! b如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:  Y9 v' G2 ^$ |+ z
tar -tvf test.tar #可查看test包中有哪些文件1 _  K! M% D+ z: K5 [, ^
打包后删除源文件9 l1 g: ^* Y, w6 w2 \5 J  |5 \3 f
2 C) B( Q9 K' }+ _: y
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
' Q  N7 h5 b. ~tar -zcvf test.tar.gz test.log --remove-files
/ d0 V, x, `+ k4 z. c! c+ l; b打包除指定目录或文件以外的文件
+ z9 m5 [- y2 q% n& m  @" _' S. C
" Z. W7 j* i. K( T, A1 q. h$ S对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
, q- b- K* e  ~; w, J9 _tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件( @& A) j) `" O$ l. [
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
9 u" }4 [3 N: m) L向压缩包中更新文件
' R6 a& T- |* X! a& g8 O
% O- @2 R! ?0 z% c1 l4 D$ D# V例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:7 c! z) N, q2 R# r" W+ f
tar -tf test.tar --add-file=test #只针对tar包1 `, F! M0 }# D$ a
向tar包中增加文件
) y1 z; I" P% T3 N
" Q) n3 u& w( J9 h$ H  i% ]+ y: O向tar包中增加文件可使用-r参数:
; B: \7 P4 j0 q6 I5 Q7 G  L- g' xtar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
9 O4 o) P9 d  {删除压缩包中的文件
  p" g1 t1 k0 @; e' C0 Z, ?
* `8 H5 S2 {* S) f- C% ^在不解压的情况下,可使用--delete选项删除包中的文件:! \% ~, J# Z0 h
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
! F0 _' W$ |1 x) N* d解压5 ^8 G( V* [# O. t9 ^
/ J; a/ Q$ Z& @& q
解压tar.gz和tar包到当前目录
# x3 ^8 W7 J1 |3 I
) C: v' M/ t+ K! c+ k. |tar -xvf test.tar.gz
7 B; m  W. o7 Atar -xvf test.tar , U1 U( V3 D( o6 e, H! ~& ^4 A
解压到指定目录$ t1 e& O" n) {
% T) Q# i( \* T/ k
tar -xvf test.tar.gz -C dir" `9 l$ V+ S# a: a' u, p
tar -xvf test.tar -C dir
1 t: Y% r- E5 B1 k解压包中指定的文件
6 r' y! t+ ~, v/ F
/ a3 L0 W+ q& K9 d5 A2 N例如test.tar.gz包中文件情况如下:+ a+ B" V, z/ s1 V" g- ]7 q
1.txt  M& V1 N( N( o. u/ P4 V* F& X: y
log/6 Q/ M+ @& @, E* k+ i) K
log/1.log
+ j" S0 ~; N- I  }log/2.log
& v6 c$ ^% {9 B6 W6 `log/2.log+ O8 D$ B( [7 Z8 o- m; X
log/4.log
  a+ ?. ]3 M8 ?- v" glog/5.log" ?# x2 q8 z5 @2 o# \
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:0 b+ p/ P3 P# S* M* A: Y$ ?; y
tar -xvf test.tar.gz log/1.log! h4 V4 i9 B+ V9 ]
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录; C: _1 O, V5 B( d/ V8 p% N
解压时去掉目录结构% U1 _1 t- H% Q& Y/ ]
) H6 J2 O) {" L
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
4 z& c+ n" w# ?  T) mtar -xvf test.tar.gz --strip-components=1 #去掉一层目录9 g2 }# P6 M6 C0 _8 M! |
解压时不覆盖原文件
. p( v) n2 E/ j5 I
% f& k8 \/ M* m! v当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):1 {# [% p/ B( \) k) ~# W9 u5 O
tar -xvkf test.tar.gz
2 p. w& w& C0 K: q特别提醒
9 P! }0 D1 \5 U) {" g
, ]% T6 w( x  x% {% G前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
6 L" b0 e4 H2 R, z& xzip/unzip  c$ S* D) ?- w& |% M3 d

3 {. |4 `7 G$ c6 qzip和unzip命令主要用于处理zip包。  U, ^5 n: b- Z) j. y5 |8 }
压缩6 z, d5 |, a: J, m. I$ C) o! ?
: [0 Q0 w9 V* [
涉及参数说明:
% P+ {! F* A0 s-d 从压缩文件内删除指定的文件。
1 B7 S- N! L1 ^/ @-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。" L6 |: R, x$ j" c+ L- H5 Q( k  b
-j 只保存文件名称及其内容,而不存放任何目录名称。
; c% p) }) {: X0 O' h4 z-r 递归处理,将指定目录下的所有文件和子目录一并处理。
9 {8 g3 o+ E3 _- p9 y-u 更换较新的文件到压缩文件内。
9 D4 b2 D& i% h-v 显示指令执行过程或显示版本信息。* K( v+ p' u0 r. o& U
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
2 ?4 h( A: _, d& I7 z- <压缩效率> 压缩效率是一个介于1-9的数值。
5 w! X; }  ~( u6 u( b压缩文件, ]) H8 I+ _" P6 y! u
& J7 s9 C1 {3 a" P/ q' N
zip -r test.zip test/ #打包test目录下的文件3 e- N! ]  A$ j! m  V+ |
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
; H  r: u. `# g3 d2 C2 s指定压缩率打包文件
; D; K+ r0 U' V! S# S
4 E1 \  |: [% s) V+ |8 Fzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
0 E# ]) z, x/ \" n' g' T- {. i打包符号链接文件  S* b- `( E/ D% M& D. d
8 N: I* _* {# S1 h2 z  m
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:7 f% x  n2 }  \. O8 s) ]
zip  -ry test.zip test
1 m, t5 f# C2 ?! V* O' n5 w向压缩包中增加或更新文件. X( c8 E. L* d4 }* t( X5 u/ R% h

( z& A2 T9 j* b& E有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
& Q  d" G! Y" l7 F& P- Wzip -u test.zip test2 #向test.zip 包中增加test2文件
' A2 e1 ?4 c5 g; }压缩时加密% ^, v5 K$ b/ q# _! E: D

3 q# R. S: r  R0 u7 z压缩时如果需要对压缩包进行加密,可使用-P参数:
+ M6 ~5 M) f# n( |) uzip -r test.zip test1 test -P 66666 #使用密码66666加密( Q( T' }3 c# }2 v
删除压缩包的特定文件
" Q' y* P2 o. E3 d! d3 z/ {+ N# E
  l# p# R8 ?5 R/ O. i9 V* r" Rzip -d test.zip test  #删除test.zip包中的test文件. V& _! L; ^6 K8 G+ j# ~' s( o
解压$ Q/ |& g+ W. J2 H

2 d7 Y) F2 Q% H3 f1 y7 p5 s2 Q涉及参数说明:
) v. ?) [6 N' J3 y9 f-l 显示压缩文件内所包含的文件8 Q1 w( T  T( Y9 a: p7 g: k
-j 只保存文件名称及其内容,而不存放任何目录名称。
$ J9 l( Q' n: A8 e7 y-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
  l9 w# A1 g' [: r4 T" @-v 显示指令执行过程或显示版本信息。  P" V1 ?, [! ]* v; @0 r) [7 {
-d 指定解压目录,目录不存在会创建! G' V" O( _1 u# \6 b
查看压缩包中的文件信息
8 k9 g* x7 b/ N$ @) X* K( k) P+ o2 a4 B% T& T
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
  }$ R# r6 ?- {- ]! H! D* |0 Kunzip -v test.zip #查看更多信息,例如crc校验信息等1 a/ X2 v6 l6 `' |& c
解压压缩包0 Z6 w4 r/ c9 `, |# X4 S& }/ u; T
! A4 l- ~% O1 Y% F9 Z! b
unzip -o test.zip -d dir #讲test.zip解压到dir目录
9 f* ^& ]; V4 I2 ]" Q+ X* V9 Y: q解压包中指定的文件4 |4 ^8 i8 a7 N

1 s7 }9 C$ n1 b如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
$ A: g0 O8 G5 D: ^unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
1 r$ E" W4 ?) @& T/ R1 funzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件9 w6 }: u  a9 T8 i$ F  x1 g: d
解压时去掉目录结构- {& Q3 L9 n7 S2 R$ r. ^, h' M* A
$ R6 c" t* n; [% E
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:# b' W+ o( j% H. p- k9 {. B1 Z- I
zip -oj test.zip -d ./temp  " G1 I' e0 @' N
解压jar包
* |) ]* A; L) ?( }) x6 J+ M
8 h! t. r  i1 {8 L* i/ ljar包是java归档包,但同样可用unzip解压查看里面的文件:
- z; \1 v- F; g8 J  p" [unzip -o java.jar -d dir0 k( q) D$ @# V
gzip
- ^. {, p, e& ]+ R* f8 a, n3 D1 F( R2 W6 o
涉及参数说明:1 k  v3 u( r! ^* G6 v; ^4 r
-k 保留源文件! T" z: v1 Q/ p: @7 n! T
-d 解开压缩文件
! F$ S0 |! |" W$ |- \& S1 `1 Q-r 递归处理,将指定目录下的所有文件及子目录一并处理
$ U* \+ D/ X' i3 I2 p; L8 g* [-v 显示指令执行过程; `- D2 c3 R* A
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:1 f' ]+ Z5 `  v6 s
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
' z% @1 y' i% c8 a4 A  t! Egzip -rkv ./* 递归压缩& `+ b3 w* q* z# U- G8 y) f) W
解压也很简单:8 B  H$ r& n. |+ ]: d/ k
gzip -dv test.gz
; V- |% ^  h$ T, Jbzip2
3 \/ G' O  w3 z% i# H, W
1 I" W+ }2 a; W- J2 H, N8 `$ p: Ftar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
& W4 \3 ^2 n* B8 `4 vbzip2 -zk test  #压缩test文件
. K6 g- W) c/ a) @' Lbzip2 -dk test.bz2  #解压
& \" R" A: X. o$ I8 ^" erar/unrar8 ?# k8 I6 |  |3 a
& @0 |+ o! {2 N5 V- Q% s2 P
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
$ z; u5 r6 C, W& m, ]7 r7 Trar a test.tar test  #将test文件压缩为test.tar
% v) n! w" G) g9 p' x8 [' Drar e test.rar       #解压test.tar
6 }- e% j& w6 |! p* P* F9 T" Uunrar x test.rar     #解压test.tar/ @' y' _7 g! |! |' u4 ?$ v  c
压缩率比较# B) C+ |! K1 m/ s# |& N8 n

1 K0 Y# B3 y0 Z" A$ _5 W8 L% y. N压缩率一般来说:6 `7 L$ R: X% Q
tar.bz2>tar.gz>zip>tar
1 R: |' `5 ?: T: i0 `压缩率越高,压缩以及解压的时间也就越长。$ l9 {; Q5 a; v( h
总结1 |+ @5 }5 W2 |1 f6 I
9 x" r0 p) Q3 ^4 N! k" S' B
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
# X- R# \  s7 }# e, y: b有任何补充或建议,欢迎留言^_^。
5 X- t( j3 ^$ y7 e
- A6 X4 V5 L8 p1 E$ J& X* V- l4 }+ n( g4 j" v4 R! [

" }- K/ t# h: |$ B8 E

& f1 y' H7 G( R# R2 e

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

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

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