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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
, o  O7 @: v7 t5 z/ ~" r: c" Z
4 e+ ~4 M% O1 |0 I! Y# |, t6 A
, s: ^1 P0 o, B9 {! W
前言
( Z* B6 d! U; E) y/ Z$ B/ n8 N' e. Q' d8 q
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
3 l# J  V5 K7 P$ @+ K; w3 Ptar. s4 l/ F" K+ B& n" R0 a
8 ]4 _* _. m8 K$ {7 P* v
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。% n9 ?4 i; x5 E0 |0 D, V$ ]
涉及参数说明:
# j8 I- V( h/ Q. w6 m, U1 M
-c 建立新的压缩文件
4 G  Y* p; P" U6 `7 E# K) A  u-r 添加文件到已经压缩的文件
" g$ J. d' X1 N" g! ]-u 添加改变了和现有的文件到已经存在的压缩文件1 U4 \3 R# B* z$ M0 h
-x 从压缩的文件中提取文件
8 J- ^: S9 a2 [" V) S1 V, u-t 显示压缩文件的内容8 U& Q- q/ @. }
-z 支持gzip解压文件- H/ r  ?  g2 D& ?. E
-j 支持bzip2解压文件3 u1 C+ g; Q! J/ ?+ ^2 h% b/ s
-v 显示操作过程
9 j+ P8 f  |1 |$ U+ a-k 保留源有文件不覆盖
6 k" p3 C0 U  A% t+ j9 l: p( r-C 切换到指定目录
& |& A: V5 t2 A) |! Q-f 指定压缩文件
( m; D* s  \" N9 M# e0 I! V
' w- |- |3 ]0 y& m  T" K6 u1 n--delete            删除包中文件
9 _* g/ y) w; U, D--strip-components  去除目录9 k4 U' O1 M: ~/ b
--add-file          向包中添加文件
5 o  m, ]8 u! }- X3 v) r; p# k- R压缩0 D* B  d0 X0 c  b' L

. d% {/ C: b9 j: r: p归档tar包,不压缩) O& I' Q9 P; ?
1 ~' E+ D$ A  f$ F
tar -cvf test.tar test1.log test2.log #归档多个文件
  S) s+ K  B- {, dtar -cvf test.tar test/*  #归档test目录下所有文件
% Q5 A0 x, [/ c3 e9 ?6 a  ptar -cvf test.tar *.log  #归档所有以.log结尾的文件
1 y/ t) |0 e" B1 o5 n4 H3 R/ ^由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。6 Q2 r; L6 [% \! k% O  U
归档并压缩为tar.gz或tar.bz2# H' ~$ d. h6 w* {) d7 B3 f( g& g

5 P, j' v3 R$ w6 [, Q) c9 L9 U这种方式打包对文件进行了压缩:
& N& y1 Z$ p2 a# wtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
" ?8 v# R7 A* m) Y7 E7 ktar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩2 k% d; Z. O$ }
查看压缩包中的文件' @9 u+ c' Y( i$ |% F

) J7 K* h! o% D) M7 M) s如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:8 d3 R) [2 z' v5 A6 _* @: {  g
tar -tvf test.tar #可查看test包中有哪些文件
4 J3 s& d& [7 A8 D' i* t9 R/ K. R  D打包后删除源文件3 @+ c2 R' p' ^
7 B- u: e4 r+ l9 E+ |* w
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:+ H9 O, `8 O9 m% y3 ]
tar -zcvf test.tar.gz test.log --remove-files % z, P4 g' G  X$ T6 q& I
打包除指定目录或文件以外的文件
: ~7 R7 G. W! k8 H% \+ J' {# [
! I2 e7 \* a4 b  T+ s. p4 S对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
# L& Z4 a3 p' T* k, P1 Otar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
0 x4 D: U3 k7 E* Q; [这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
1 X/ e! j# K/ V. N/ B向压缩包中更新文件
/ s+ B9 ~$ x: R+ q4 Z
/ r! p2 [8 d5 u, ~% \) U7 g( F例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:3 ^& z3 Y" X* m- A  X7 D; s" v+ ~* V
tar -tf test.tar --add-file=test #只针对tar包
( `0 s: o! j% ~4 V# p* n" m0 h向tar包中增加文件
! o; Z: m' E% p* w, I7 w# @5 l  o# x& N5 [3 W9 a! B0 |4 p1 T) O! n
向tar包中增加文件可使用-r参数:
5 z# U9 h  q7 A; j* t8 o6 [tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
, H5 J3 i- N* _  B: n! _) V删除压缩包中的文件( \1 T" f' o- z) p8 I* K

# J9 ~) K+ `% k9 i) v& l4 y在不解压的情况下,可使用--delete选项删除包中的文件:
, U, `9 E8 `0 a( [- Ptar --delete -f test.tar  test1 #从test.tar中删除test1文件# S2 n9 M* O1 J) q
解压
( p5 z! K6 c# X/ J7 U, \1 B$ Y# y7 v
) m. W4 w- K! z* ?7 ~8 d解压tar.gz和tar包到当前目录
: l/ x" B" m) J, W" [0 X
& U' `6 e3 W! p& z) B9 U4 S3 r# Ktar -xvf test.tar.gz
) X% g; c+ l. P+ X( @$ Rtar -xvf test.tar 0 j: N% f0 w/ A& j8 k1 N
解压到指定目录
! f. }  Y% f5 d3 @: |# g! z! D9 u, E  m; [
tar -xvf test.tar.gz -C dir
  Y$ Q) |# C/ T! M! ntar -xvf test.tar -C dir1 C6 O) v2 S$ j/ B( \
解压包中指定的文件4 t$ L+ ]4 q% u3 h9 O, Q' ~7 K, d

( O! m* P1 {) M  g, ^7 s6 ~例如test.tar.gz包中文件情况如下:0 X) q3 O& G4 F8 o
1.txt
/ p6 }$ K0 M! _% w* V0 D; Dlog/
! ]0 [, ^1 V4 l- {# Ilog/1.log
5 B- M4 r6 C7 H- D+ G5 ^log/2.log3 A; K( v& r, _5 W% P; W
log/2.log$ X* w3 A. H6 \5 d% h
log/4.log! e% j$ T& e  `$ f, f9 @
log/5.log
9 I: b0 V& F+ C! Y0 U如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:2 P7 f4 ?" t. O8 E1 A' T$ D
tar -xvf test.tar.gz log/1.log0 n$ t, s  M3 Q
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录) t: ~: X, w6 i2 s
解压时去掉目录结构
9 E7 f- z' k% Q7 O0 I' c; Z; Z+ b, }& N- U) \
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):( x2 b3 j$ [+ k
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
" g: q9 M4 L% L7 I6 F解压时不覆盖原文件/ v6 q  p0 k! m& @

5 Y' }. Z1 G6 ^8 l! w/ ~* E当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
" \: ^7 D4 z0 Gtar -xvkf test.tar.gz* @) j. m; `* U) R
特别提醒' p/ I# H$ K1 `
' o4 _% t' {' Z3 K7 s
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
0 x7 ^  W  i$ o9 p) d7 J& ?zip/unzip
1 I- I; r5 Z6 k( W- ?$ i' y; b2 [5 ]& k" e. C
zip和unzip命令主要用于处理zip包。* |7 ]  J5 n* I0 i  O, ?: O+ M6 g$ g
压缩; B/ D7 e) X) D5 E* v6 z
4 _; q$ D" k$ v% n( Q  ]% [! H. q
涉及参数说明:! A0 J' y& i8 H: e! Y. W: d# V
-d 从压缩文件内删除指定的文件。4 @1 n/ B& q* o/ n4 v7 @
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。8 C( i0 A4 m) a
-j 只保存文件名称及其内容,而不存放任何目录名称。
7 g: u0 {, h+ `% @3 t+ ?# Z4 S$ v! [-r 递归处理,将指定目录下的所有文件和子目录一并处理。
* c- q' F/ \) u8 c+ G-u 更换较新的文件到压缩文件内。
4 ^! Z5 [' g& e1 _0 Y$ \) H-v 显示指令执行过程或显示版本信息。$ \' }2 g; S1 |
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
0 O9 u, a/ u: k6 K7 N- <压缩效率> 压缩效率是一个介于1-9的数值。4 H' {; \. @' N- E" s; |
压缩文件
  B3 ?. \1 S+ Q7 l0 P- q3 O0 n
( F1 m8 f- W3 u' S) t$ k  Zzip -r test.zip test/ #打包test目录下的文件1 j' J# G' [4 c
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录! u1 Q; L5 ~) I. f
指定压缩率打包文件) h) l& t1 |% H5 H) n' x) N6 l

2 D8 b% c* O3 A* v7 [% v$ Yzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
; h+ G( V9 a4 x  X2 D打包符号链接文件) V3 U- x9 D5 N, F. I0 `, w# C
; a) X- a6 d4 @0 t
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
& R% b7 i  _" T  h" Y. ~, ~( ^9 rzip  -ry test.zip test# z. |; i8 t; M5 k* K$ K
向压缩包中增加或更新文件
4 g3 W6 ]- |$ |; L) ^: S* B3 L* M. `1 E7 z8 ]
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
$ m' ~7 O, ?* m& M7 q* Izip -u test.zip test2 #向test.zip 包中增加test2文件- Y0 b) C& p( {: ~
压缩时加密
: b' ~4 K8 U; q! Z8 q/ l% B
+ ]4 T$ i( n- J5 c( e" J6 E, w* S压缩时如果需要对压缩包进行加密,可使用-P参数:3 Y' N3 _! {# d, }  b* ?
zip -r test.zip test1 test -P 66666 #使用密码66666加密$ G1 I/ K. A0 r! T
删除压缩包的特定文件
; F/ D( X2 I& w4 Y. z* O3 Y
5 \) Y0 @" Q$ X4 izip -d test.zip test  #删除test.zip包中的test文件4 A$ N2 b" Q6 f
解压
& e) Q) c2 _2 y5 b
' Q- f7 g+ T8 ~8 T! ~3 ^涉及参数说明:
# z. N0 `4 p- H8 b-l 显示压缩文件内所包含的文件& _* T7 J3 G4 L/ @+ T( w' ^
-j 只保存文件名称及其内容,而不存放任何目录名称。+ l9 f9 [6 U% ?  g7 {5 ^
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该: E/ V2 E$ U0 t3 h; B
-v 显示指令执行过程或显示版本信息。
3 _- ^, O+ V" N-d 指定解压目录,目录不存在会创建
. J3 H; i! N8 W! b查看压缩包中的文件信息
; y+ W0 l$ E2 p$ m5 ?1 b% d0 l/ E; }3 H
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息; h2 c1 s$ x% u
unzip -v test.zip #查看更多信息,例如crc校验信息等
0 e0 M* h; z, S8 W解压压缩包" C! `( P; F4 k. f/ w; D
5 y3 F6 L( b: E9 Z. Z3 A# R
unzip -o test.zip -d dir #讲test.zip解压到dir目录
4 U' V& O/ \6 k1 U解压包中指定的文件
! }/ u$ |; i- l. _( M; W
" G2 p8 f. G0 F如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
" J" l6 s  K" K# g0 S5 Y% Punzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
) U# ]& ~9 G2 d5 r$ Z; \$ munzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件7 w1 C" ]& S/ S) j& M' f9 O9 ^
解压时去掉目录结构
6 @) m" @+ |' R1 v. Q6 B
% S# m  c8 Z3 a压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
4 C& [, T7 d* O9 V# m& Hzip -oj test.zip -d ./temp  
1 Q/ g0 r, {4 I: `' f& P7 R, w解压jar包# }& `9 T. |4 B1 b, m; @6 m* G3 m
, |$ ~9 N# F* p1 w; e# }# z
jar包是java归档包,但同样可用unzip解压查看里面的文件:
' w/ ]2 U0 t  p7 D  `2 S# D$ Nunzip -o java.jar -d dir
' p1 K+ ~6 Y' o; cgzip
$ @4 Y& p1 r) o6 n, E. I* o% E  w  j( {. _; ]
涉及参数说明:2 t& J! @( l9 v6 Z
-k 保留源文件" d& P4 j6 ]: w
-d 解开压缩文件
& Y' j6 }( e6 V* ~-r 递归处理,将指定目录下的所有文件及子目录一并处理' ^8 ]; `2 g( ^1 d
-v 显示指令执行过程
' f/ d$ K# ?0 H4 h! B( qtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
: A+ k9 b; d, g7 S, q4 i$ Hgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包  p, k0 c7 @3 v! B) v
gzip -rkv ./* 递归压缩
4 T! U8 g- d) `解压也很简单:$ w& y4 ~# L3 j% H% n7 `
gzip -dv test.gz
3 Q; C+ T/ h( [/ n* J* C! b% Q1 Ebzip2! \  I& g* W% w/ A

% r; L0 D+ S8 Wtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:. D5 b- c/ P; T8 h8 r2 [& Z
bzip2 -zk test  #压缩test文件
! t, }  v3 H  J' Z5 P* Pbzip2 -dk test.bz2  #解压
4 K4 T6 {6 T. b; N8 h  m! g$ Nrar/unrar
6 B" F' S( y: B
9 _& K8 o4 N7 [9 x- |4 crar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
8 _2 Y. W" b/ T" erar a test.tar test  #将test文件压缩为test.tar6 d( F# }4 T2 ]6 }( A/ f" ]
rar e test.rar       #解压test.tar
$ z5 \% p, n* p+ K. W7 nunrar x test.rar     #解压test.tar
( P: t9 H( J# [! f" B$ \压缩率比较
9 c+ {2 I& a$ R! l9 j' o6 l* v0 I* F& S* ~! L( I
压缩率一般来说:/ y9 Z% s7 j: s' ^+ G
tar.bz2>tar.gz>zip>tar
2 n( x  o* X+ o压缩率越高,压缩以及解压的时间也就越长。
0 h1 o2 j. j, A# z- n总结
8 C' l( ~; |2 ?( @9 Y5 o' u
! }- L* l! P/ H1 F& N对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。* e1 _$ A0 j0 l) }, n9 ]; |$ W
有任何补充或建议,欢迎留言^_^。+ c" J1 p1 L3 h$ h! `. P
- s! h' [5 y9 ]( g3 y  V. _8 ]

& i4 i0 H7 T% Y' M7 P
1 O4 R( _' i* f! W
' q/ c3 H! N5 J5 ~9 P' x7 W

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-5 07:01 , Processed in 0.057236 second(s), 32 queries , Redis On.

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