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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
5 B6 ^: c  ~' P( R1 O$ C# e

: W# R0 u8 K" j
; N, q6 C, Y- _7 D% r0 I
前言" w4 m( K5 @: q. V& Y; M: u0 O
3 v! q, r* P) {% J- j& n
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
+ r/ I+ @/ g+ z% ~- G0 star
. Z8 h4 e! v1 {" w* `* V2 m* S- m0 u) k7 N
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。7 r; K7 K* r6 O4 f! V" i, M
涉及参数说明:

' P6 L! t; ~2 f- n; w-c 建立新的压缩文件
" t2 d8 G8 C/ _; l" g0 o! b-r 添加文件到已经压缩的文件
6 k' A- V* n+ A-u 添加改变了和现有的文件到已经存在的压缩文件, i* ?: X$ t) P1 x
-x 从压缩的文件中提取文件
' _% L" d$ ^) Q5 Q' |-t 显示压缩文件的内容. e- M. Q* u$ S5 t4 `7 Q
-z 支持gzip解压文件
2 g8 f0 U$ I! R5 x) h-j 支持bzip2解压文件
* w9 |2 I' T3 ~-v 显示操作过程8 W5 S5 C% _4 `6 l3 \+ Q6 m
-k 保留源有文件不覆盖0 e* C+ q3 [7 R" [$ z9 b' H
-C 切换到指定目录9 [5 h5 w1 L" z6 |* S: a
-f 指定压缩文件
! x8 S3 K$ A) m$ p) P2 C- E7 X
) H6 X! [# c1 o! S# j' |2 r--delete            删除包中文件8 Z' W9 I% Y$ j) p5 i7 b! q1 H; |
--strip-components  去除目录
3 B  B" \3 N9 ^/ Z4 i8 r( e--add-file          向包中添加文件
! ^2 ?) w! c3 O. }" H. N( H/ [9 a压缩- Q) j) R: \9 W, f  f
1 @) A9 V( v( j2 ]/ R$ t: _
归档tar包,不压缩
2 S# J) h8 q3 {! U
9 W9 f  @1 m! I% m2 Z! ~tar -cvf test.tar test1.log test2.log #归档多个文件
. O( O& L6 B8 b$ m( ^tar -cvf test.tar test/*  #归档test目录下所有文件+ F+ T) l8 m- q; [/ n. A
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
* L8 q4 C2 J7 T由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
8 K4 v1 K) f: c0 m归档并压缩为tar.gz或tar.bz2
0 z4 l4 K1 Z. M. V! ?; X* O7 _8 h: |* }( |! b
这种方式打包对文件进行了压缩:
# I# {2 S: S% L: X7 e# w4 Gtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
3 S/ K: _% w* o3 N6 O2 ltar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩7 F" d. [1 A" W9 C5 C. @' U
查看压缩包中的文件
% [4 x: O% ]6 N
7 P' W2 [" l; O' q如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
. W8 @* n6 L* K) Rtar -tvf test.tar #可查看test包中有哪些文件
- e5 }. w7 K9 I. I0 i打包后删除源文件
) h% C4 ^; r# y+ V
2 l6 J# K& M0 u1 x7 ?, o* W4 y( U有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
# A) t' h; M. v* D, ktar -zcvf test.tar.gz test.log --remove-files
/ C, D6 P7 |" L" `9 ?  b) O$ i/ ^9 h1 D打包除指定目录或文件以外的文件6 U/ z# W5 R1 A/ u

; s, z/ r1 U- H/ |/ j: \4 a对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:( n, N2 ~# W: c6 Q: q: r( @
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
  M; b) h. t* F% w; ~' |这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。, k& P* l4 ~7 _% s5 Q
向压缩包中更新文件$ n& p7 t' v  K- @. l, N" L
$ r5 i* V+ h" y9 |* x' r2 J, N5 ~
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
: W# |* V/ {2 etar -tf test.tar --add-file=test #只针对tar包* @6 t2 m8 C, h( n9 k
向tar包中增加文件
' ^" b5 W6 D% l1 P/ ?( [+ z6 \' z1 H$ Z% f' i9 Z, h% q
向tar包中增加文件可使用-r参数:
& P- X5 h- j9 J* |tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar/ l* z& x% e+ \6 N$ J' m4 E4 y
删除压缩包中的文件! Q. O  I) @: I4 ^
  D, [  _( Q& H6 Y. R, c: J% n
在不解压的情况下,可使用--delete选项删除包中的文件:
9 B+ G5 r  w+ S* c; a5 U' Z% ttar --delete -f test.tar  test1 #从test.tar中删除test1文件
3 j4 t7 J/ z( [/ U+ n' J: X' _解压" M* ]% [6 ], f

' Y6 w4 C- L1 y  @: F% z1 j解压tar.gz和tar包到当前目录/ K; u7 M6 Y: F- |1 O7 L5 w
% q) z: J! w+ u) W# |' ~" k
tar -xvf test.tar.gz
" P  T# @' _0 J; O/ K0 F3 Btar -xvf test.tar $ z: b/ b) ?, X" v- b, V
解压到指定目录
. y6 ?7 {$ ^% N1 W4 a  Q) O9 e% `: b* o4 M% R+ J
tar -xvf test.tar.gz -C dir
- i. [& n( q' w6 l. r0 z8 w! Rtar -xvf test.tar -C dir
# s! G7 U) o0 c5 f5 p# w- g解压包中指定的文件4 f& F; G& P* P7 m
: z6 E$ P8 q' O3 b+ P) u8 U4 X
例如test.tar.gz包中文件情况如下:0 I8 n* e' O( K2 @  N" k- n6 X
1.txt; r) ?( c, g  \# }, S7 B- t: @
log/! }' r3 a4 |  @! x' {, f
log/1.log! A1 C- d' o! r' e' Z3 Z
log/2.log
0 p! X; W- Z+ ^# P$ x, Y6 l& g% klog/2.log
1 }; P. u5 H" l- `! Z& d  llog/4.log
8 X7 Z- y- Y0 V: h( t" U5 qlog/5.log
3 A# `5 D% z, J) ?+ \: X" n- y如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:9 G; U8 b) E# O4 S
tar -xvf test.tar.gz log/1.log1 D* Y, r1 @; m% J. B0 G: S
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
$ f  t3 `( }  G, \4 d解压时去掉目录结构; O% O, g9 W# R# G2 O$ L4 @* X
5 d6 @/ G6 [& u2 G# i4 W3 ?+ x4 {$ T
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
  Y3 @. u( H/ Z; ^6 z7 C( j) Rtar -xvf test.tar.gz --strip-components=1 #去掉一层目录. z; [& D2 B- G
解压时不覆盖原文件
  {1 i" t6 b/ d
9 V5 B; C4 C% t' _7 X# f4 D/ k当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):" T  t# D! M; p/ U
tar -xvkf test.tar.gz
1 m- f$ E" b7 z; f. V  p3 D- ~特别提醒! c, O% s8 }9 v

4 |* k$ t. C2 A' S1 l前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
- k0 W0 Z  _$ I3 D7 yzip/unzip
: c3 p9 _+ Q9 m! ]
$ @( a' o; S: I3 Ezip和unzip命令主要用于处理zip包。
5 r# {$ z  n. Y& l/ u% Q) a压缩
+ L6 }6 ]) Z0 W) h( C9 p; }. o, o7 l5 l6 D5 k2 C* F
涉及参数说明:
% l1 i$ `& H/ Z-d 从压缩文件内删除指定的文件。$ g  f# q0 h# n& b8 r( w; w& f
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。) X% o1 v( s6 D; l( l1 \! S2 t3 U
-j 只保存文件名称及其内容,而不存放任何目录名称。- O( T/ s2 {5 i; R8 w# x' p0 _9 d
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
4 W- ?$ I) ^; V8 K-u 更换较新的文件到压缩文件内。. X' |0 K5 V5 b$ e1 }/ }' ~
-v 显示指令执行过程或显示版本信息。
" z1 E# }3 y6 S' A-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
1 n6 o2 J1 N% W  D1 s- <压缩效率> 压缩效率是一个介于1-9的数值。* |9 y! ]) z( s7 w
压缩文件/ J& @$ d: X5 V- h

# U' h8 I" j6 D) O1 Gzip -r test.zip test/ #打包test目录下的文件
: _$ g, ^3 p" u/ @zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录! M" A4 b9 V5 Z8 g; A5 ^
指定压缩率打包文件2 U4 P% T" t5 T3 y

7 u7 |4 Y- Y$ l; X* M4 ?5 x* _zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
1 }3 f- M! w0 P! x4 b( p打包符号链接文件! N- n& u# N2 ]& W6 f. d3 h8 S

: w! _' v, C9 M0 M, U前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:5 w0 r' i. v1 c" u! D) {8 Q  N
zip  -ry test.zip test7 ^- y; P7 I9 a- o( J
向压缩包中增加或更新文件* [8 v1 n1 q. D7 _* Q
5 s9 R6 H) v$ W. Q
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
9 Y% a# d. v3 Z, j% N; M7 tzip -u test.zip test2 #向test.zip 包中增加test2文件
+ \) e4 l; m5 b+ u, l6 y9 s0 i# V压缩时加密
+ d( @6 @% a1 L1 U& u" y# ^- ^$ U- P& B9 o
压缩时如果需要对压缩包进行加密,可使用-P参数:
2 Z% T# q0 |# t% B& ^$ j, _zip -r test.zip test1 test -P 66666 #使用密码66666加密
7 C6 H5 S: @; h7 y8 R删除压缩包的特定文件% R; d" Q& U/ I  N, i* b' I
, H/ I$ j( @/ h1 K# U$ {
zip -d test.zip test  #删除test.zip包中的test文件8 ^5 W) Z! D7 @9 e- F8 f" p1 p
解压
/ x/ R, n8 G. D5 }- p: ^
6 v. ~1 h# o! j5 z- X& |涉及参数说明:0 f) c, O3 k; c6 K3 C0 o' d/ S1 H9 \
-l 显示压缩文件内所包含的文件
$ Z' M6 S6 A- m$ A! [  }-j 只保存文件名称及其内容,而不存放任何目录名称。# V  K+ t5 k- z
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该# b* f6 m7 E; O0 m
-v 显示指令执行过程或显示版本信息。% S! n/ p8 e7 F* I& s7 e
-d 指定解压目录,目录不存在会创建
" [( m5 F7 \* S查看压缩包中的文件信息
( ^9 Q* s$ O( `2 a' \2 @8 ?
4 N' z7 E: {$ r/ k& ^" K7 Yunzip -l test.zip #可以看到压缩包中的文件名,日期等信息9 h$ e1 ?5 l& E
unzip -v test.zip #查看更多信息,例如crc校验信息等
1 ^+ k* e% B$ B. q8 U' U解压压缩包, N; s! M* @- T- Q! {: c

' Z) z+ L0 Q# \; t2 gunzip -o test.zip -d dir #讲test.zip解压到dir目录
' M; u4 p; d$ q1 Q' E4 N/ k0 {解压包中指定的文件
6 U: E/ v  t# T* A' ~- e, j6 T, c
8 C' v0 `% Z. W' n. J3 k如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:1 K' s, J, `  w# g! d( g
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
' a3 A# ^! A/ i7 Kunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件, M" ]! V# q: Y/ z
解压时去掉目录结构: t* r9 Y  f$ K

1 P4 m& m5 m9 f  ?) u压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
2 P+ G% D. G- I) ezip -oj test.zip -d ./temp  
) j/ n: n3 n# d解压jar包; E3 j+ {7 i4 P& Z0 H' t2 n# r

% t1 Q2 B* ~& t' bjar包是java归档包,但同样可用unzip解压查看里面的文件:& p; D- Z& J$ y5 k/ S* Z
unzip -o java.jar -d dir3 S: v: ~/ Y( \
gzip
( I/ N( W8 W, `! \( u0 @
% ]& f% c; A4 C# [5 W+ m涉及参数说明:
; p) ?# ?# f0 d- R, @/ E, I-k 保留源文件/ S4 O7 [2 o0 |
-d 解开压缩文件
; _! V% G# @# R$ a-r 递归处理,将指定目录下的所有文件及子目录一并处理
% U7 k  h* C% s4 Y' _: A" Q-v 显示指令执行过程
0 Q8 I1 h* ?! _tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
' p- V2 p% U% `3 @gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
7 k! t+ C7 D3 Ngzip -rkv ./* 递归压缩
: x" ^9 y* \' }, X1 i6 \; V解压也很简单:
( p2 M  a; q$ ~gzip -dv test.gz
8 s2 |; u! f/ ]3 u/ abzip2- Q) N4 [4 D& |0 u1 N- F5 e
2 Y( C. N8 ?+ C: y  y# B! Y. s( P! \2 d( B
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:; n+ ?" U- u, M1 b: V
bzip2 -zk test  #压缩test文件
, @& j0 i2 N; O/ abzip2 -dk test.bz2  #解压/ P+ E) f$ O5 c, ?( B! |2 |
rar/unrar2 U: f& e" ]/ X& {. f. ?" E

0 c* i, X) }, t( Rrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:" ]$ h& W3 a. a% i
rar a test.tar test  #将test文件压缩为test.tar
( X6 @& g9 O) f& @# q. h! C; srar e test.rar       #解压test.tar1 d( {  K6 S( j
unrar x test.rar     #解压test.tar& a- e' G5 e3 q6 \0 A
压缩率比较: b7 L- D! O- J( U4 I- ~0 V; B6 A4 x

8 H& t: P7 c$ Y' J- p8 R压缩率一般来说:6 b! L% M# p9 {! `
tar.bz2>tar.gz>zip>tar
/ i, e1 x, L0 f压缩率越高,压缩以及解压的时间也就越长。
9 s& B( y' q$ w5 i  N8 I# E0 ?总结. Q, `, [  M. G/ b4 h9 ?

8 B+ U( d' |7 \( U, C对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。4 Z! P9 @) P. V7 w: S
有任何补充或建议,欢迎留言^_^。
) w9 h  a# p* ]; o/ o
# V- f9 t) j- e
% F( Z( l2 j1 n5 A& K  i( ?
6 C( N, R# R8 j
% W) L; S5 b( G+ C+ r

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 03:29 , Processed in 0.073635 second(s), 33 queries , Redis On.

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