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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

& ?: Y7 x; K6 c5 \# M0 T: @& f! I+ N# g

5 ]. m0 t0 j" V: G/ T- t6 P( m* ?) f前言
9 D% f' S  N2 `' g
" C% y- V# K( h; \! aLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。3 o7 S2 B; f& T& i7 e% q/ t
tar7 h. J( C% _* y% Y( I+ k2 [! n

- L7 ]( R" h4 Q! _/ Ltar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
9 w) A" B/ R2 `: @/ `$ X涉及参数说明:
- E0 n8 F4 E; u7 l& {
-c 建立新的压缩文件
( S6 t, d6 m* d0 O3 I-r 添加文件到已经压缩的文件) S. S* L& z5 R1 i8 T* z% p3 R7 [
-u 添加改变了和现有的文件到已经存在的压缩文件
3 K. s/ `& M  c5 t, }-x 从压缩的文件中提取文件
4 }; Z% G  O& a& j1 B- M-t 显示压缩文件的内容  r- I' m9 Z$ y; f& H2 i
-z 支持gzip解压文件
" P8 N9 t0 |  n, J7 j. m2 z# }7 o5 Q/ Y; {-j 支持bzip2解压文件
+ g$ f2 ], _( `1 j5 H/ q-v 显示操作过程+ V# n% Q% f- m, e) U1 Y4 s
-k 保留源有文件不覆盖
. X  }2 u% L2 a( l: W-C 切换到指定目录
/ k4 q8 `% f, ~-f 指定压缩文件" L3 ^3 H+ W4 K4 F1 ^, X; y

5 v* @; |/ s8 D- H3 l# q: i7 m; p$ J--delete            删除包中文件7 m2 p* r  N8 D" ^, C! \. Q  F+ V
--strip-components  去除目录
: w/ S( H5 ~! W. O+ j9 [--add-file          向包中添加文件
( K5 d( j6 L2 {压缩
. ^6 P6 F& n. L* _* q& s2 k' l
% w6 p0 \: v% k2 R+ D: }% t) [; L, Z归档tar包,不压缩/ X7 v. e7 r8 ~0 C8 U
1 y3 `# h# O) p6 b8 F
tar -cvf test.tar test1.log test2.log #归档多个文件
0 e' x. a& C3 `3 u5 L  xtar -cvf test.tar test/*  #归档test目录下所有文件
' d9 k; ^, F# u8 utar -cvf test.tar *.log  #归档所有以.log结尾的文件 : f# _) @& p3 L- u0 Z3 q# @  e
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
( e' w; V3 G3 B4 S归档并压缩为tar.gz或tar.bz25 Y! U  l) Z- u
9 i* K& t; N% W0 M0 h) s
这种方式打包对文件进行了压缩:( o1 N  q: N. Z, T( P1 f
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩! b! W2 v  H1 g1 R
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
6 C$ Q2 Z0 Y# S: z4 \! U0 V查看压缩包中的文件; e# v. h$ e/ o: O" h5 K

8 k6 v3 o+ r. }如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:+ u9 J) a+ O) b
tar -tvf test.tar #可查看test包中有哪些文件
6 M5 w6 B4 n) w0 ]打包后删除源文件
" [& b4 t: J1 k3 i9 I0 N% b3 A& A+ {: g9 }! i: M, p
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:/ ?4 x# o9 b, v4 v
tar -zcvf test.tar.gz test.log --remove-files
& G' U5 @" `* J& n打包除指定目录或文件以外的文件) K" W/ z# [7 K% @# s

# Z& m* g" o7 V- c5 ^对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:$ ?/ F  ~; J8 B, u5 ]4 @; G# E, o
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
/ q/ k* B# u  j+ T$ m7 L这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
8 O) j7 U- h; s# p6 U( D向压缩包中更新文件/ I9 Z5 Z: ], @. a: Z+ c2 v
0 q0 w6 ~. R7 o) R8 c! C$ Q
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:, n6 y! X2 ^; |+ k
tar -tf test.tar --add-file=test #只针对tar包
) _& C+ y: t6 C& D向tar包中增加文件# g" n, E6 C" l+ c& }
4 q3 H+ v0 J5 |8 M+ S
向tar包中增加文件可使用-r参数:
* v2 J9 M' l9 _tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar: j3 H. B3 ~7 t, ?. ]0 Z
删除压缩包中的文件
" e6 e8 l. H. j- u" Y) A/ R% p, x# z
在不解压的情况下,可使用--delete选项删除包中的文件:0 M3 L2 y' t( U4 p+ p" J" K
tar --delete -f test.tar  test1 #从test.tar中删除test1文件* r+ z8 S8 P( w. u* [
解压+ S& O6 A* x) s4 N# ^8 s; ?
# j5 t# h$ E; s9 F
解压tar.gz和tar包到当前目录) w% I/ C# r4 G) ^$ b7 K
) C9 I  [$ [4 t
tar -xvf test.tar.gz
: i7 g3 K! Z7 R, c; J" Btar -xvf test.tar
- {. v% ?# `4 A6 h) X解压到指定目录
) {! k5 F" b( v- G, C
5 [; [' }1 f* c/ L- z. Rtar -xvf test.tar.gz -C dir% Y' S/ Y2 S% F6 x7 x% l6 j' \
tar -xvf test.tar -C dir
# G- M) a! H! s' V! w解压包中指定的文件
( q' T; ?2 ?# [8 B5 G0 ?% v! q. [  J
例如test.tar.gz包中文件情况如下:- \+ O, W. V6 l) d
1.txt  j) B8 r- E! B$ O, N& ^5 G
log/
0 g* b3 S3 a: q; U2 alog/1.log
$ O) Z% ]; Q' P6 L; d$ m3 z7 Xlog/2.log
2 X8 L- s- |/ W7 ]  O4 h5 T( Elog/2.log3 T6 r# w1 r0 \0 u1 w
log/4.log$ {' ^& N  Q( X
log/5.log8 v6 |" ?3 l$ w1 O4 M2 L
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:  x% \: T, x) }' {' s' R
tar -xvf test.tar.gz log/1.log: y% o/ A7 ^6 v0 L4 B; m
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录3 I* V6 \5 `( O
解压时去掉目录结构4 p- A4 v: y. l4 z+ }# r
1 ]. Y0 R8 N8 N7 c5 d! d
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):( q1 v$ a- M* E
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
+ p& h% S8 o/ S  D解压时不覆盖原文件
+ b& H' x4 G/ |% ]/ r3 A+ ]+ a
+ v' t- A3 I3 e+ i- C: G2 t当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
" n( Q& u$ X' htar -xvkf test.tar.gz
9 M0 e- @  Y0 M- A8 [特别提醒' X7 k9 E- i0 |: G" c! A; R
8 c5 T3 ~1 L' `" v
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
0 D) J( y- f  p& Dzip/unzip  T, e' M4 G( A. O# m; Q/ C, a7 @; G

9 S8 v- n, w) s# L0 Xzip和unzip命令主要用于处理zip包。
7 f* Q1 ~: E# |7 C) m( F压缩7 l* f4 v+ l% F4 \
) d+ o9 v) W  t" A! ^; p
涉及参数说明:
1 E4 y9 @  ^$ ^-d 从压缩文件内删除指定的文件。
7 x$ S9 _* J2 C+ N4 f' u7 w" f5 e; x-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
1 J* C! l% N% L4 }* O-j 只保存文件名称及其内容,而不存放任何目录名称。
  |5 B# U, I' B' ^9 U4 a-r 递归处理,将指定目录下的所有文件和子目录一并处理。- Z3 L7 c$ f7 `0 e
-u 更换较新的文件到压缩文件内。
/ I; c2 U6 d4 w- m9 G-v 显示指令执行过程或显示版本信息。
- c) {. w! S# O-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
% \: ~% B  b7 ^5 f. ~- O. Y+ B- <压缩效率> 压缩效率是一个介于1-9的数值。6 Y* V# Y$ ]" d/ q7 m. A; O
压缩文件1 Z1 a2 u0 Y- u4 q& b0 J+ |/ A  M
9 Q, g$ a5 i) x
zip -r test.zip test/ #打包test目录下的文件
" z- s5 B" ?- D( Zzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录- \2 J! a' i2 i' J  j: Y0 G6 i
指定压缩率打包文件" r  b! E/ ^* ]: {+ s6 E; y! e
* [9 Z- t! y2 H4 X
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长6 o7 O% x1 ]. s8 E* |
打包符号链接文件( Z5 G7 ]0 s+ P. \( M5 P

8 @! r1 L; [& g$ m( u4 U8 a9 a, r前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
1 x$ o1 k: ]( J1 w7 |' Hzip  -ry test.zip test) i! Q, y2 m9 ^8 }4 v2 e4 w1 g. b
向压缩包中增加或更新文件
9 n: t' |0 A* ^
- V6 Q1 i4 ~# _有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:* q: `" N0 A* }% `
zip -u test.zip test2 #向test.zip 包中增加test2文件
8 G# o$ Y9 j0 V( C压缩时加密, J* s7 @+ ]5 d

# x4 N+ {7 {, k压缩时如果需要对压缩包进行加密,可使用-P参数:
5 Z& l0 f6 \) X2 i2 Nzip -r test.zip test1 test -P 66666 #使用密码66666加密
. }, g% z) q) n# G6 b' g( M删除压缩包的特定文件7 G+ \( e9 g6 q# H
3 b$ c# K/ a! V4 q' G0 e
zip -d test.zip test  #删除test.zip包中的test文件
3 |. u' w+ A8 w1 a解压# m2 k( d( S& {! [7 }

5 Y) d( Y" f8 i: o5 ?# t; d涉及参数说明:5 Q/ S/ C! d& U5 y5 L0 W, ?) b
-l 显示压缩文件内所包含的文件3 H) b+ u/ m  k/ s. A) V
-j 只保存文件名称及其内容,而不存放任何目录名称。
' ^' _) m2 }# a- S+ x-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
/ M9 ~, R0 B* h$ I5 E( ^: d-v 显示指令执行过程或显示版本信息。
& x- \# F* Q( \-d 指定解压目录,目录不存在会创建! z# S, {7 n, y3 Z: X4 z6 ^
查看压缩包中的文件信息! R9 q- |  W7 F/ T: W" S% N* J! ^! N
" N  k5 W# o* F0 D) g8 \
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息* B# |, e+ {! t/ d  z3 h1 ^9 {* m
unzip -v test.zip #查看更多信息,例如crc校验信息等
+ N. A3 g. X* K- _' l: g解压压缩包
  S+ @' ]9 l9 R0 I; U) T7 `3 x: l8 w4 D
unzip -o test.zip -d dir #讲test.zip解压到dir目录  [" n% |0 v8 i& \. A6 J( t; {
解压包中指定的文件  u5 s1 t. G/ l, Y; s! u$ \

8 h2 e8 W; _) U' O4 Z& p* s如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:: s/ k3 a* Y" Y# P$ n" V. i3 q. K0 t
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录8 F: f2 O4 f6 a( N0 ~4 E$ q
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件/ g2 \- \8 ^/ g$ B" H
解压时去掉目录结构  x; |+ K" I8 [8 R: \1 {2 Y4 W" h3 i

! U: W  p" p# B4 P5 P压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:; ]1 Y4 H  n, N$ z, a' k2 H4 \) r8 ]
zip -oj test.zip -d ./temp  
- P: v3 @- {. @4 L# v# e解压jar包
. d* t# V% A$ g) h$ O" R
& d3 `$ n* m  \6 P/ R5 n! @jar包是java归档包,但同样可用unzip解压查看里面的文件:
# y8 f4 H8 p9 `1 t0 tunzip -o java.jar -d dir
6 M5 t8 Q8 b# P1 a/ v; v% I0 Y9 q$ tgzip
  v3 z, g1 I+ m8 h
2 k# O+ u! D, L0 h/ D! A涉及参数说明:
- X* p' ^$ b2 M. i9 y! p-k 保留源文件
5 k: r/ e: k) f2 M  {-d 解开压缩文件- F; _! m/ A5 v, d- G2 J
-r 递归处理,将指定目录下的所有文件及子目录一并处理
7 ?3 t/ P' t5 m9 I% Z5 r7 m2 a-v 显示指令执行过程
( {8 ]5 x0 M/ ?* \: }% l, Otar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:6 D% I/ w) q: h& H7 k1 L# c
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
" N' ?+ X- \$ {; ^+ ~gzip -rkv ./* 递归压缩
& h7 O- d  Z$ X/ z; F解压也很简单:
0 ?: e0 |& J8 }& L/ l2 T  cgzip -dv test.gz $ H" `9 e: n8 a
bzip2% x# x8 U. {, e) W3 L6 J
& p/ x" g7 o1 r5 F! C/ Y% N8 i
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
% C; o: S7 z* {8 v& l# ~8 Hbzip2 -zk test  #压缩test文件) d+ y5 [0 q& [* o
bzip2 -dk test.bz2  #解压2 I) _$ d1 @( t( r0 u  b. N
rar/unrar
& n; F$ ~1 ^5 r9 d
  R0 m/ \  s* w4 Q! r/ l: Vrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:1 w  }2 `, W0 o. `
rar a test.tar test  #将test文件压缩为test.tar
3 @' V# ~  ?4 b2 p* D( ?& Trar e test.rar       #解压test.tar
+ z" Z9 r1 z$ q( r) v" ]unrar x test.rar     #解压test.tar. _9 ^% Y, m5 X' j! o2 C7 \5 D  _; u
压缩率比较9 p5 }) P: T8 e) l+ `6 p

2 J. Z0 b; H$ T) l' z  r压缩率一般来说:) [  G6 y; k2 W% h* z0 \& `/ R7 s
tar.bz2>tar.gz>zip>tar
" h2 I7 p$ V$ d* N6 L! ]压缩率越高,压缩以及解压的时间也就越长。
- l+ y( \1 R$ y. ^# n: K总结
, m! l$ M6 s$ d9 x( n9 P. ?, `- h' e6 f/ z7 m* _: D
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。5 F' }- V9 N0 W$ t6 j
有任何补充或建议,欢迎留言^_^。
- N6 ~( s/ ^+ ]0 w' ]
1 g6 x$ ~& P) W- a6 n9 t, _; ^
% k: I" Q0 [9 K7 Q. R! q+ L  D9 F# D1 H

9 [: b8 z' ?7 p- i1 ~

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-15 11:15 , Processed in 0.065384 second(s), 32 queries , Redis On.

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