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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

+ b# W& L# l& c. I  |. F8 k# Y. A+ j

" s: e6 ^$ Q2 K  M4 F6 t前言
& z( c7 y: S1 Y2 V2 Q9 o% @8 B/ ~$ `! K2 U
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
7 j8 p9 f$ W' d4 i, F; E3 ttar
" }: }) C/ X- H6 d* @1 F% W  U: T3 @; ^8 R
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。& z' m/ N5 Q2 ]- e% B
涉及参数说明:
2 r) u' {5 @/ O; u- P7 q% k
-c 建立新的压缩文件- j& p: F. ?' s& g/ {# S8 u! L
-r 添加文件到已经压缩的文件
  u1 w1 j$ m. C0 Y/ m8 Y-u 添加改变了和现有的文件到已经存在的压缩文件
- d  `6 x% \( v3 K6 t-x 从压缩的文件中提取文件
' }' v1 l7 Z, T- D0 ]/ v$ _-t 显示压缩文件的内容
/ f/ `+ r2 Q2 v- S1 c6 G-z 支持gzip解压文件# M- Y- C6 J0 h3 n! p/ i: E+ }
-j 支持bzip2解压文件) g) d7 L& |" X2 b0 d
-v 显示操作过程
' {. t, Z7 W! U9 j! p5 T-k 保留源有文件不覆盖
4 h: \2 E* Y# z. A1 P7 ~-C 切换到指定目录
7 i3 r, N% G5 K" i! g3 }; ]-f 指定压缩文件+ n2 l- E- F* ?0 u9 x6 j
( V2 t9 V  w4 N
--delete            删除包中文件
' H" F, v4 ]2 p7 S" c--strip-components  去除目录5 j4 [- u7 O5 p' w' o+ m
--add-file          向包中添加文件
# A- r4 t; L+ g3 j压缩  }& m6 i& A- e3 T- U6 ~

- L" a7 O& z7 A5 y归档tar包,不压缩
, ?4 j6 ]# d- l0 M5 q: L+ n) o
( B! p5 {- w3 X9 w) `1 u! R6 ltar -cvf test.tar test1.log test2.log #归档多个文件/ y. ^: ^$ ~, a: t4 z
tar -cvf test.tar test/*  #归档test目录下所有文件
) u7 Z# B3 c& C, l3 ]7 [0 z& Vtar -cvf test.tar *.log  #归档所有以.log结尾的文件
7 T5 V2 p( u- C% P6 r由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
$ M( h' n( i* S9 e归档并压缩为tar.gz或tar.bz2
% l* L) X* K, n6 G0 E' Q* j. I& t( r, w$ Q( `1 x
这种方式打包对文件进行了压缩:
. A. {! y8 T) v+ W. a: |: f4 Ltar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩' Y; V5 C' a' e, r. _) s' ^
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩# v) _- a2 u4 F1 H2 r0 l( Z3 Q6 l! W
查看压缩包中的文件
3 M7 n! R$ Y- G3 h# m: _+ k$ O+ y1 [# J9 q' ~% \
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:1 {4 z% F+ S5 }) c" O& g
tar -tvf test.tar #可查看test包中有哪些文件
- h$ t3 \- Z0 ?7 b# b打包后删除源文件
) K, z: z! l9 }# k) m
5 A: d( L; Z8 [- R有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:6 j' B7 U3 s) v, \$ K2 W, s
tar -zcvf test.tar.gz test.log --remove-files
7 R" }( I9 ^- F& {& r" a打包除指定目录或文件以外的文件) P/ i- S( y. l  @! w# p5 O) ^+ z

! @8 A; `' \$ O对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
4 ^: W+ g4 X2 O, z4 X2 v- \: u+ ^tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件$ r, d  h/ n% P+ s7 t/ R' S
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。% u' K# b3 R  L$ `' y+ z. h
向压缩包中更新文件0 a8 O8 B  G1 h
: {. _4 j+ r* g" }" Q# @
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
: R  T& a6 v8 j+ m6 c; ]. j, |tar -tf test.tar --add-file=test #只针对tar包9 y  i# y. ?& t$ z
向tar包中增加文件
/ Z7 [  h& I4 l
/ @1 T: x' k, W& K2 S! X向tar包中增加文件可使用-r参数:
+ {$ i5 ]' Y+ btar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
7 U7 f$ C) n! g* B/ F: b8 P删除压缩包中的文件. q0 Q! g( k) J: A5 m
% g% W1 R$ d. f4 m
在不解压的情况下,可使用--delete选项删除包中的文件:
& ^( w$ @6 R, h( N! r0 \tar --delete -f test.tar  test1 #从test.tar中删除test1文件
* x7 G* U/ Z/ Y- t解压/ l9 k  O5 U8 w% M5 K9 w/ q
- i0 v5 G! l/ J: D. [
解压tar.gz和tar包到当前目录
8 y2 e+ O9 p" v! K2 O0 |
( W2 L; [3 t1 t1 z8 Gtar -xvf test.tar.gz
8 j9 F. F1 k3 c2 }2 Etar -xvf test.tar
% z3 M2 e6 k& B, x5 S# U" ?1 |6 w解压到指定目录$ M% V/ h2 g6 i. l. ^' A

) K+ O; s* Z4 s3 {! ~3 Ztar -xvf test.tar.gz -C dir) v/ _; \- b1 w7 }0 s3 X
tar -xvf test.tar -C dir2 _5 ^$ p  T& f6 p
解压包中指定的文件0 |& w, D2 }9 N' c+ u7 Y! i0 @9 h
) V; M/ g: i! Z$ U) r9 ^
例如test.tar.gz包中文件情况如下:% h6 W" h9 f; {3 D6 S
1.txt
& G/ R6 _. l# Y. clog// i) \1 T5 l; [% X# s  s
log/1.log
1 f/ k+ ^9 h% B3 r9 O8 E: d# plog/2.log" d, r2 J( h1 ?; B
log/2.log) E, e6 S) b6 f2 U" d
log/4.log
; J$ f! s3 e8 p. ~8 n: Y0 Rlog/5.log9 t2 m/ T8 F% Z  D5 K' B" w" E) W
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
. e& u3 U0 G1 U) Mtar -xvf test.tar.gz log/1.log
$ z$ P# E% X/ Jtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
: {( M# x( U9 ^. g3 L) ?  D& U解压时去掉目录结构, i1 ~; c% [6 l4 i7 j- G
4 B/ L2 W2 ^7 H. y6 t/ c
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
( }( \/ U# |. S8 W. V. Ntar -xvf test.tar.gz --strip-components=1 #去掉一层目录
$ i7 G- w8 \' t' {' J# i& W) K解压时不覆盖原文件2 H5 g7 K- d7 v8 M; E' L$ a# `3 t

* p& B, ]' k6 E" k  z0 t5 U6 Q当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):  r  ]& G, X' _9 X0 }( B- K
tar -xvkf test.tar.gz" Z7 E; c, \4 Z% r1 F1 C( {3 f
特别提醒
9 j6 z3 W! W6 n) K$ T* l$ _& \. q% h# F3 `
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。/ s, e: k5 O" B9 J1 w
zip/unzip
) h9 v& ?1 Q5 J
" n0 Q% i- R! t) m8 d, p& ]( ozip和unzip命令主要用于处理zip包。8 V' {* ~) R* S
压缩
$ D! i, n: U- f3 @9 u
4 |: Y5 B& c' S2 m涉及参数说明:
- W4 j/ t8 ]: `# O/ {$ E-d 从压缩文件内删除指定的文件。9 u3 ]& z+ n% h1 G0 D. E% G! |
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
+ ~: ~  d/ k5 v% V; O  f. u-j 只保存文件名称及其内容,而不存放任何目录名称。
& ~" }% B: [: Y/ y* W6 y; X- m; t-r 递归处理,将指定目录下的所有文件和子目录一并处理。
/ }1 ?/ e" i  [1 M  L0 H2 P-u 更换较新的文件到压缩文件内。3 J$ a# l% p- R
-v 显示指令执行过程或显示版本信息。$ s0 @1 ~/ H( k* D3 ~( N
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。2 ]8 J1 X: R4 `) h) A( ~6 t% s
- <压缩效率> 压缩效率是一个介于1-9的数值。
* s6 n1 f, ?+ u: _  U压缩文件
0 Z# Y, I# ]9 m8 a0 \. S, N9 g! v* Z7 w! {" g
zip -r test.zip test/ #打包test目录下的文件
2 E  B& C- _+ j% }$ C2 Rzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
# m2 }2 {! ?/ C' L/ y指定压缩率打包文件4 k( R7 H+ B, w' @9 N$ x

2 E" k2 S, M& M% q7 @2 Xzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
5 z0 N/ k4 W1 p* x$ s: W" ~打包符号链接文件
) a* ~! t6 W3 V5 u% n5 ]
5 A2 g& V  V9 c5 S9 o2 C, M/ z前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:9 n5 K) a/ n2 [/ O% m6 n# z
zip  -ry test.zip test( d9 i9 h8 j/ |( N' _, L1 c
向压缩包中增加或更新文件; l/ B' r/ v4 l! G
5 p" T4 n5 ~$ I, e
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
  d4 v: G' o& Z: x: a5 ~zip -u test.zip test2 #向test.zip 包中增加test2文件) i/ t- H: {  d) I
压缩时加密
& ?6 i( G3 R* c
5 P  R, p5 K% d0 ^. H( ]" F, z压缩时如果需要对压缩包进行加密,可使用-P参数:/ _5 c. f- B$ B# h( s
zip -r test.zip test1 test -P 66666 #使用密码66666加密; K7 s% \$ U# P1 @2 ]4 o8 }2 ~
删除压缩包的特定文件
& d& N$ r! q+ ]; l" k
/ m6 }( q: p( Z* g' U: V, ezip -d test.zip test  #删除test.zip包中的test文件
& o! @- c) C! d+ l* K1 d解压, g7 }; l( U& i& k! C7 b3 n

+ \& X9 h2 N+ R; ]. I涉及参数说明:9 d: h& F# M# }# L) \) c5 H0 x
-l 显示压缩文件内所包含的文件. @" b" Z' P/ a. h1 F: M/ Q( D
-j 只保存文件名称及其内容,而不存放任何目录名称。2 I  v+ @7 g0 I( T& D9 ?
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该, p. M2 N# ^! N% e' m0 r3 k, l
-v 显示指令执行过程或显示版本信息。% J/ `3 O; N9 {* q3 `2 k/ c" s! d
-d 指定解压目录,目录不存在会创建
4 k  D9 \$ H! U查看压缩包中的文件信息
9 I- W6 q/ I- \6 }; U) e
6 c. g/ L7 [6 V) J7 r, C& cunzip -l test.zip #可以看到压缩包中的文件名,日期等信息* Y3 d+ F: |+ j$ N/ B
unzip -v test.zip #查看更多信息,例如crc校验信息等
9 w/ b& ^, d/ D" A0 s解压压缩包/ s$ J( Q6 V5 k, L; H$ }

/ r- X8 U' W9 F* wunzip -o test.zip -d dir #讲test.zip解压到dir目录; W! Q# P% V* Z% n& O# ?' @2 k
解压包中指定的文件
% N4 R$ a8 d0 b. j- ?- Q, f2 n; D/ I2 E4 x
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:4 i& |% t/ o  ]3 H8 E( Z
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
# T0 V; `1 d, Q& [unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件; ?. W) X( X6 a5 J
解压时去掉目录结构
! L$ W  e; Z$ x- U+ c. p
7 A0 A! a1 I" d9 D压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
5 m" n0 z. g- \zip -oj test.zip -d ./temp  
* W8 [2 h' V+ e" O9 `: i解压jar包, p9 K  P0 k( j2 Z1 b/ V
1 f  r- ~7 {0 h0 T
jar包是java归档包,但同样可用unzip解压查看里面的文件:! |" D- F, e; ^6 w) O
unzip -o java.jar -d dir7 x9 {, H3 J2 z3 S* [3 h- b% r
gzip0 h2 `5 x5 D* B- s

- I4 j) l$ d. t6 S& O' Q* v涉及参数说明:6 J! [  \% t* v- e7 ?6 d. ?8 h2 z! O
-k 保留源文件, J" C. ?8 E# m! v3 s  c# t
-d 解开压缩文件
5 }8 x4 w6 D0 V  J: n% P& r8 q-r 递归处理,将指定目录下的所有文件及子目录一并处理& D( H7 V9 k1 n9 G6 p/ s- j8 x
-v 显示指令执行过程
8 [; G& V" X  a8 B7 ^7 ]' u! Dtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:+ m3 C) N/ C9 S* Y# |
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包6 H  Y/ a0 j7 M1 D# X* ~' `+ l
gzip -rkv ./* 递归压缩* K5 `; c: z: G
解压也很简单:: ~% y" s4 }0 w0 r, Z
gzip -dv test.gz % M0 N5 S) i6 j" _% e
bzip2
0 a0 a& {2 |3 n' i$ V. {1 ^  A0 q5 q, ^
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:; D% l: G! D1 H; D
bzip2 -zk test  #压缩test文件
* o. t) t, \$ I, }4 rbzip2 -dk test.bz2  #解压  x, v4 T, c6 G" a4 p
rar/unrar
  \; \; q7 @: M) _. |
$ [7 M6 S- |8 ^4 a6 [6 I2 E" n, Zrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:8 @2 @5 ~9 Z$ T  }$ E
rar a test.tar test  #将test文件压缩为test.tar- i) N, C2 t7 i0 {6 f' E  M
rar e test.rar       #解压test.tar1 b5 A1 u& a" J8 L' @5 G/ |0 s3 ^% C
unrar x test.rar     #解压test.tar2 o) `5 I+ @+ R1 Q: o
压缩率比较
* D# }6 D7 D! Y4 o! z2 j. o% }/ _* J. z5 y. k# S. d
压缩率一般来说:6 p; B$ v! W4 O4 Z/ _; `& I& \
tar.bz2>tar.gz>zip>tar6 I% I3 w) e3 d  Z! h9 ?. h! I
压缩率越高,压缩以及解压的时间也就越长。" p. ~& E/ Z- [3 o* T' }* Q8 E
总结
" T# q3 f2 A, a0 a7 n* d# x
; H' S9 T: p+ D4 T2 Q$ q' |% D对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。. c, t4 g" n5 j6 T
有任何补充或建议,欢迎留言^_^。
* @) `# j& a( V8 s# n) b! {2 f- ]5 d' C% a& T4 I8 B0 s3 L7 Y

4 `; q0 ^  j, V, w- C) c+ z  A. }, \" C% q# I2 y2 H& M

- K0 X; `2 ~* w$ @. _

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-5 07:22 , Processed in 0.073176 second(s), 33 queries , Redis On.

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