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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
  f7 ~# i, N8 D2 S& t: ?3 y

" F' D8 {" s7 V! c
7 G, G. ~/ @$ v# ~
前言  Y1 h5 R6 i6 |0 u

# M! G( A" {9 \Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
4 b: X" {5 u# t9 {/ X4 [tar' R" a4 O# C: A2 O8 g! ?& ^
! {. f3 E+ j1 X) E* V. A  P
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。/ S6 o/ D+ R; B5 q8 F5 y, H$ u* S
涉及参数说明:

6 U: Z3 {) ^! f' u- Q-c 建立新的压缩文件6 f' {2 |  j' C+ }: W) @3 Q/ t
-r 添加文件到已经压缩的文件$ D+ N" a1 H' \
-u 添加改变了和现有的文件到已经存在的压缩文件
1 j' u" t2 g8 O2 z-x 从压缩的文件中提取文件
5 R& S8 O' u$ d& P7 ~-t 显示压缩文件的内容
- P. r5 F0 H' l' h& x6 q8 l: x-z 支持gzip解压文件
: H( r  c& m% c6 V+ |-j 支持bzip2解压文件
' H: Z7 @) X5 ~$ \/ V" y: o# o: q" g-v 显示操作过程! J% j" n' l8 M. x( ^( X
-k 保留源有文件不覆盖
8 |% y, p. i% s, {* L* B/ b-C 切换到指定目录+ Q" e/ ?0 `0 ?: a8 R0 |
-f 指定压缩文件
4 M; W  x. l( n, Z( K3 [2 r" r- ]$ o& K# P
--delete            删除包中文件( z* U) L! {& c. D# F
--strip-components  去除目录2 U; N- a! ]3 t
--add-file          向包中添加文件
6 b" p, b: i1 C/ m压缩
2 J. p& J/ T$ R. W" _
4 a, y: j, G6 ^) S' V1 h& t4 R归档tar包,不压缩$ g6 C! S- Y& a$ f, I5 C0 K# g
' `" W# K! |! v6 x) ]) _* K6 B1 \
tar -cvf test.tar test1.log test2.log #归档多个文件
: @! [% g2 R& v3 ]7 ?tar -cvf test.tar test/*  #归档test目录下所有文件
+ R, ]1 s% V& q6 g0 ~/ wtar -cvf test.tar *.log  #归档所有以.log结尾的文件
% {5 j, |& ^7 X' Z+ M8 m由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。; D$ A: T4 |+ o/ i: B$ ^+ }. m
归档并压缩为tar.gz或tar.bz2/ I0 R' x% X1 |0 V6 U, [

, C+ [  S% |+ c" q' z3 x6 |这种方式打包对文件进行了压缩:
  a( Y- I. K/ J# ~% B# X  ^- `tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩# s+ g7 X" D+ h3 Y  U
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
$ S7 H4 f- b/ W+ |; s2 F% t查看压缩包中的文件3 ?) S( W1 D. G! N& E
: y# P# J  U' @$ ~
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:( ~; J3 m) m  E
tar -tvf test.tar #可查看test包中有哪些文件- r6 k# y2 s) R2 N6 ^
打包后删除源文件# B7 i" U* p  I7 n! R
/ C9 P. Q9 v- a2 Z) i
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
( i" l* S" E" K9 ^1 a. u: ltar -zcvf test.tar.gz test.log --remove-files
  y/ q9 Y# U+ \# ?* g: }- f5 d打包除指定目录或文件以外的文件
, U7 ~- ]6 w+ ?2 C5 ]( m: R: v# C% T& N9 [6 e- d# x  g8 [5 L4 c3 Y; b2 Z0 F
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:! J0 r3 J0 ^' R/ j$ X
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件' S2 q! Z: z6 j, ^# x# _( O# |
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
5 c$ N: s) n- n9 D6 \9 `向压缩包中更新文件
7 H6 Q; ?& v, ^5 J
' |: K" g9 k% r例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:) m" x' ]% p2 Q7 S: _
tar -tf test.tar --add-file=test #只针对tar包9 u, O  E9 O6 x3 ?, h! y5 D  F
向tar包中增加文件
3 I+ k! A; ~, E- x3 s' U& n4 u* T4 v' `9 M$ _# I
向tar包中增加文件可使用-r参数:
: s" l( R- O5 C0 h8 atar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
* k" @7 T. D$ E, y9 E% z0 c删除压缩包中的文件
( N9 V- x5 a( A) n  o$ v& e0 ]( m% M& f; |
在不解压的情况下,可使用--delete选项删除包中的文件:; s  h' Q5 e3 d8 {" F( @/ w
tar --delete -f test.tar  test1 #从test.tar中删除test1文件3 Z2 f& R% r& t& Z5 g
解压
* e3 F8 n9 ]( @: h8 Q% ?3 L4 x) }. O( `% F- R: E
解压tar.gz和tar包到当前目录
& o+ z  N7 r) v  ?( s4 t0 M7 U$ |' Y1 J
tar -xvf test.tar.gz
4 v$ d- D& [& dtar -xvf test.tar 3 h8 n8 I! I  z$ e
解压到指定目录/ H; d9 M- ?6 w: \
2 c6 l' F& F0 \: K8 K
tar -xvf test.tar.gz -C dir# u4 k3 _6 d$ S* U. ]1 g
tar -xvf test.tar -C dir/ e/ e' N8 B& @) W6 X# L
解压包中指定的文件! j0 [6 |' i& d) A% H2 K

1 O9 S1 j$ g0 C+ K* n例如test.tar.gz包中文件情况如下:) w* m$ Q1 h3 q3 B- n
1.txt% ]% I7 v0 d/ Y# A! d
log/! ^) R9 \9 \% k0 M3 L8 c
log/1.log
" p$ M% p8 @, C" H$ ~3 rlog/2.log
+ R$ r7 ^7 G0 W4 d/ clog/2.log
% v& `2 `' F5 W  C+ t9 G9 y# M3 qlog/4.log
( J& _9 M! y* Zlog/5.log
3 i; l3 z2 @' p( N' O如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
- q8 A- k# z0 N* @9 G1 otar -xvf test.tar.gz log/1.log- z5 h( @" S3 p' F
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
& y8 K# K* u( C9 [) w3 Z解压时去掉目录结构
/ o& \) ]/ l" j9 B  M" |/ t* H2 p  N, l3 n5 u5 L6 z. Z
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
, D3 h$ c$ L. I. g! Z+ q0 A. d$ Ztar -xvf test.tar.gz --strip-components=1 #去掉一层目录
3 n/ _$ ~/ P0 F* V解压时不覆盖原文件' x9 U+ U, m# w6 H6 |4 v6 y

% C  ?5 X6 n7 y2 G. ^当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
$ X+ r! X/ D, r3 |: jtar -xvkf test.tar.gz, c2 J- I7 D, y
特别提醒8 r% Y& [9 P! \& N( v* q

0 {  o" D" Q: Q; B# V$ D前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
, @) c' N' _6 U4 H; V3 v& g6 mzip/unzip
4 G) a% p1 v3 ?0 G( S# t. x! n" f! L( e0 p* K: A
zip和unzip命令主要用于处理zip包。
  W6 R) U1 X8 Y: v! k& }- l% r压缩
+ F5 C$ A- N- ^. b) r/ D' `
! v/ q3 W: o2 x3 K涉及参数说明:
2 U* {1 A- P3 D( Q-d 从压缩文件内删除指定的文件。
5 x% ?8 O8 m; o" L' q  J  [-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
# s0 D& K7 Z' u- [# s-j 只保存文件名称及其内容,而不存放任何目录名称。
5 G. h5 m7 u$ q% q5 S+ z-r 递归处理,将指定目录下的所有文件和子目录一并处理。2 }' _0 M: `: H9 r2 `  X% u! O! r$ }
-u 更换较新的文件到压缩文件内。/ i/ e$ Z/ Y! F% e
-v 显示指令执行过程或显示版本信息。' X  a0 n# b- H( ^  C
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。. H* @/ C4 W' |1 v% V5 c
- <压缩效率> 压缩效率是一个介于1-9的数值。
( Z: A/ P, n4 M& u  `压缩文件/ n" g) @9 ^$ |

8 m5 P3 _! N, kzip -r test.zip test/ #打包test目录下的文件
  P! a4 r, b8 \) A, q% hzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
* o2 y" N5 A  ~& G, e2 o' H: j  @指定压缩率打包文件
0 v1 B5 B1 |, s+ w7 M/ o: z4 B& Z% C5 N4 s
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长# e5 D$ n. {: ^! ^' W' \( n0 X  P- N
打包符号链接文件8 H- v+ A( I# i0 r
1 y" P: ]- {) C/ ~; E
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:" L6 q3 q( T5 \9 ^( l  N* C& E, g
zip  -ry test.zip test
5 T( S7 X- e# u! A3 Y5 r/ q向压缩包中增加或更新文件8 G# R- O7 u8 D/ H
( R0 ?- k8 U% \" X+ z
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
( [& W4 x1 ]1 _) q) V, B) w, }4 |1 fzip -u test.zip test2 #向test.zip 包中增加test2文件5 ^: {5 ]" w! O6 i8 p2 V
压缩时加密, c& T2 W5 X) u
( g- w7 N7 o+ c% y: Z7 A
压缩时如果需要对压缩包进行加密,可使用-P参数:
6 K% v: B! Y5 E: U% F+ m# a2 Xzip -r test.zip test1 test -P 66666 #使用密码66666加密7 j9 A9 Z* v8 B" m0 o
删除压缩包的特定文件
5 a0 ^1 a& j; y( Z; F! B  i
, V* i! l3 Q1 T8 q$ `- z6 j; Tzip -d test.zip test  #删除test.zip包中的test文件
" _. q/ C0 Y. n  a- ^& y: ~2 L解压: O9 s8 t0 i1 C

# X- P# o5 {. @+ ^* W. w2 a; e涉及参数说明:
& C! ]# [! Z) I: V9 y' G- Q-l 显示压缩文件内所包含的文件# Q: G% ?2 m4 e) K0 b1 E1 F
-j 只保存文件名称及其内容,而不存放任何目录名称。
! ^. S% F: m; K-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该5 }: c# ~, t( h! T. v
-v 显示指令执行过程或显示版本信息。
6 F* l) X# l8 j1 q-d 指定解压目录,目录不存在会创建8 y( A8 h5 K. b2 c
查看压缩包中的文件信息: @: K7 Z* Y* B
" n# m# T: l; ^. h$ r" t5 B# f4 G
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息9 i1 D2 r$ c6 @( N
unzip -v test.zip #查看更多信息,例如crc校验信息等
3 d5 P' ^' g/ \解压压缩包& v( s0 m- w9 I8 v8 q
7 K% |* T$ T+ J2 F8 T) d& j- x( T
unzip -o test.zip -d dir #讲test.zip解压到dir目录. z2 O; H9 l" w
解压包中指定的文件+ H: j0 l, ~3 t% g- b' m" Y
2 y4 A- D1 u: U3 e0 u
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:0 a. V0 N" {, d' e2 P9 b2 w) `( W
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录  N' v. U, G8 X
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
1 V4 |  J) |  s; s; v# S3 O解压时去掉目录结构  @( G8 X, K; U3 {% Y
0 n; f2 o7 \* k! H
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
5 Z  H; o- v2 ~$ h" \/ Uzip -oj test.zip -d ./temp  3 s0 m4 J! y6 p9 W! _. H
解压jar包
# m( `% [4 a9 a$ h# v0 U4 J2 N9 Y1 T0 [! P+ L1 w) I
jar包是java归档包,但同样可用unzip解压查看里面的文件:* B; L9 f3 R* ~" X$ Y0 I
unzip -o java.jar -d dir
$ S& w. u( e% E; z  Wgzip8 C' e+ J2 J7 m# z, z8 c2 I
4 o& E! d+ l) s# J4 H
涉及参数说明:
" E" A, S; Y/ p: A' p. \) a  n1 F; x-k 保留源文件( V% O% g) W/ m* t" j
-d 解开压缩文件4 }% p' v& Z' d, o% ?0 R
-r 递归处理,将指定目录下的所有文件及子目录一并处理) q( e2 T1 r7 X
-v 显示指令执行过程6 q2 [5 d) c2 M' u% y+ y
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:2 V6 Y2 D5 n2 ?% ~7 ?# I7 t% {; L/ U, F2 @
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
9 r) I+ x8 D6 F2 R. Ngzip -rkv ./* 递归压缩) e& w/ ^( i; ]( H% B
解压也很简单:
4 ~' a1 h% ?8 Agzip -dv test.gz " r* H  w5 H# G3 i* N$ C7 E
bzip2
! K& x+ [3 T9 W, `8 Z% c2 k* k
( R( G# O* `( k; W( ftar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
7 g& I0 H* F6 k& abzip2 -zk test  #压缩test文件
. }5 k- n9 P" n; pbzip2 -dk test.bz2  #解压$ n$ V+ |: ~$ F3 x* q4 K2 R
rar/unrar
; r( k; H9 z! j. l! ~$ p+ O9 i1 Q' p0 ^
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:& C7 f; G7 B! F% X+ M
rar a test.tar test  #将test文件压缩为test.tar6 v; X4 ]0 e5 ]5 K8 |8 ^
rar e test.rar       #解压test.tar+ h& d6 x( y0 p9 }
unrar x test.rar     #解压test.tar
. @$ F. u# ~7 J压缩率比较
5 E  Y: d  L. j7 ]" J9 @8 {- T
$ g' q) l9 d- H0 j5 w1 a压缩率一般来说:' I2 [9 g7 G2 {4 I  E# W
tar.bz2>tar.gz>zip>tar
$ Y6 c- _) |% p% w" P$ _: W+ T压缩率越高,压缩以及解压的时间也就越长。
: k0 A/ O: N1 @% u3 u总结2 K" |5 R8 b4 T9 t0 Q

: U, M& z5 N( t2 L对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。, p+ ~! Q) B8 G4 Y4 g
有任何补充或建议,欢迎留言^_^。0 _0 J6 r' D; O; v6 r, N

$ _" F# ?$ k' D( f& M2 @4 N& X% J$ R$ \1 C
* ?! y/ T" W1 k5 A3 L  z

9 L! V# f- N6 E: p  Z. }

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-17 12:10 , Processed in 0.064746 second(s), 32 queries , Redis On.

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