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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

& R& Z- Y0 Y! l0 s$ {5 d' Q; Z9 s# U- |# ?% b
- p! S$ `; I) ^
前言
+ z7 k5 e/ ]. L# n0 B+ S; A+ Z& U$ K9 @$ o  C
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
1 j+ F  _- \- s- b5 Ztar8 ]& Z" y% h  Z3 ]3 n

' F# `' L9 C% k* rtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
+ }+ P3 J4 [, E- O. ~涉及参数说明:

. M# J/ ~  `" f: q0 X( [-c 建立新的压缩文件- V2 C" @9 r/ i, }6 e* q! \
-r 添加文件到已经压缩的文件3 ?. e! W7 U0 U7 N, n( K- k  w
-u 添加改变了和现有的文件到已经存在的压缩文件
( a3 S/ u' n4 p0 c, n-x 从压缩的文件中提取文件
% l$ ~8 O- f8 V) M# `2 r-t 显示压缩文件的内容
3 g, Z/ z( K3 G5 ~: {1 H5 V-z 支持gzip解压文件
( Q# r) P- N& r1 O-j 支持bzip2解压文件
9 n4 ]) B7 p7 ~2 B1 y-v 显示操作过程
5 d- w  f* h# |* J7 E( f' J-k 保留源有文件不覆盖
; d6 @. t* ^5 r7 `  V3 a-C 切换到指定目录
- C, U4 X+ S% s" K/ Y0 ^+ z4 _-f 指定压缩文件
, V3 n8 q( A/ h9 q9 a- R2 c; L  Y
. r* Y! h2 \- i6 f5 K2 o: S--delete            删除包中文件- F5 [' `( X3 H9 l
--strip-components  去除目录2 W! f  j! Y" k* w, A
--add-file          向包中添加文件
' k3 X' F4 F2 c- K* S1 f压缩1 G6 w4 i) {1 T1 s1 }

* G5 u5 v! h% X" h归档tar包,不压缩
! U+ N5 H8 }7 B# Y9 u# ~' x9 Y9 z8 A+ ?2 g
tar -cvf test.tar test1.log test2.log #归档多个文件
( x  z% |+ p- [& L' ztar -cvf test.tar test/*  #归档test目录下所有文件# @" W' N! k- ^5 V, @" v; s  H
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
. v  H# a; u; D4 d由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
7 s& A" J4 W) e7 G归档并压缩为tar.gz或tar.bz21 [" d2 D  O; _5 v
% v& z6 S& o* n8 o
这种方式打包对文件进行了压缩:! t1 q* N) X$ D, J& `% ~
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩2 N4 ?+ H# O5 Y
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
/ ?' }" S& m7 f7 ~' |. C! b( y查看压缩包中的文件
3 }) c; v$ l* H" h  L$ H. ?8 U. ?: q" t* [9 v- a& c
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:1 ]8 B/ e5 Q! A3 v
tar -tvf test.tar #可查看test包中有哪些文件
/ m/ n4 [$ g& X打包后删除源文件
; j( |! A0 [6 B1 S* w9 u9 u! e7 b
! U( q+ Q) m0 K9 b3 |* [有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
3 b1 Z5 L$ v+ M: wtar -zcvf test.tar.gz test.log --remove-files 9 v' Y0 S# ]; D
打包除指定目录或文件以外的文件; N2 W8 A) z; _/ s7 X* z& O4 }
  F6 C3 I' a2 [( O. Z' a0 {4 E
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:$ w: l6 S$ U- H  S2 I! R3 `
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件, |3 d  c* j$ e
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
- P7 O& M' s4 I向压缩包中更新文件7 {) }5 ]5 l: t7 X0 U/ h# K
' v5 V/ ~# {  I1 i4 H+ m; A6 u& G
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:! I. H0 \0 I% [/ w- ?
tar -tf test.tar --add-file=test #只针对tar包9 W5 X+ d- t$ p: A! W) S4 f  y
向tar包中增加文件6 q/ e5 _" V5 @$ `  j; e
" X! o1 i" n: N$ }! g+ Y
向tar包中增加文件可使用-r参数:6 }+ h& |+ p& m
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar3 b) _. W3 k; c. g! W9 A0 I
删除压缩包中的文件
. g- h( Z+ [! B  q  m  A! w: [! b$ i
' G! H# @- Y7 M2 y0 t6 [# r& T: a# P5 V在不解压的情况下,可使用--delete选项删除包中的文件:- n" L- r8 q; y" h1 V! j/ U
tar --delete -f test.tar  test1 #从test.tar中删除test1文件9 n: m. A4 @' i6 x% j+ D1 D9 O
解压+ N1 S' [! [3 J

: }( _# O; k. V" V3 |4 f解压tar.gz和tar包到当前目录5 @7 V, r7 N/ e8 e7 C1 W. u4 c
. t# H4 i& Z3 B6 d$ r
tar -xvf test.tar.gz
$ d6 E& }3 V  ?% G" Wtar -xvf test.tar 3 M  m: n5 X& c; V
解压到指定目录
6 I6 e2 t& z" r+ Q" z0 ^3 O( {
" L* S1 Y' k# C" ?" b) vtar -xvf test.tar.gz -C dir
+ O1 _4 ~. q( U' ]- ttar -xvf test.tar -C dir1 [) P* g1 W5 e- ?+ a; T
解压包中指定的文件
0 D3 [# R! Q! A3 ?
! q9 I4 S  a! {4 z7 a. R例如test.tar.gz包中文件情况如下:
1 g! g+ H/ ?( e" [/ m1.txt
; [: p1 T. Q# T  olog/
0 }+ }1 E( i4 V" R9 c  B: O! tlog/1.log
8 S0 y; V( {: o+ Qlog/2.log/ ^/ a/ b# C0 Z$ m8 Y' z% e
log/2.log
9 p2 Y5 N$ i  A/ G. l+ i% Ulog/4.log9 ?$ [' E2 d5 x5 x" f' R. F
log/5.log
- Q- U# N3 i/ [如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
3 ?8 L- n) o7 }) H* ]% ?tar -xvf test.tar.gz log/1.log
4 j; S# I) g) T& w7 I) Qtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录; J  v$ r/ Q4 U8 c& U0 m6 \
解压时去掉目录结构$ Z5 j  Y4 `! m, S! H1 e6 J3 r4 v

. B0 \4 t% ?5 ?, c1 m' k* H压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
/ l6 J( W# ^0 Ytar -xvf test.tar.gz --strip-components=1 #去掉一层目录
0 W3 E- `5 ^7 H解压时不覆盖原文件
; B0 ]' m, n) M  i) A8 L. }' \
" `. r0 \) G$ y2 x当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):8 H$ u# F6 H' T
tar -xvkf test.tar.gz4 }! _0 Z) V/ q
特别提醒" M6 W. N% `: [' R# D
8 b0 i6 w2 F+ S) o5 L, M
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
1 m$ e7 s5 M% @zip/unzip3 x4 p1 [* E" S* X( q* f) P

7 {6 o& \- x$ W0 O# X/ vzip和unzip命令主要用于处理zip包。
1 i# ~* e& L9 B! d) q% ~压缩
+ M( X1 [5 m* a) }9 y2 i7 u" T5 ]: x  ?4 w6 b3 f0 U/ ~: A
涉及参数说明:. F6 }, r, E3 B9 v2 L! e
-d 从压缩文件内删除指定的文件。$ J2 @, Z1 d& T+ `' a* n4 n
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。' [3 p7 e: t5 k/ w2 M) x: m
-j 只保存文件名称及其内容,而不存放任何目录名称。
  x* V+ C4 O5 i5 @" }$ o-r 递归处理,将指定目录下的所有文件和子目录一并处理。0 x" T3 C7 i/ n& Q2 q) a
-u 更换较新的文件到压缩文件内。+ b1 i2 P5 o) J1 G8 w
-v 显示指令执行过程或显示版本信息。
" z7 c6 ^+ [2 d* D+ o% [) f; b-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
2 a' W% ?2 G* v0 q5 M1 f$ K- <压缩效率> 压缩效率是一个介于1-9的数值。" z' Q" E1 l5 v) v
压缩文件
4 G0 [* H) ]/ E5 a3 d4 ^4 l
: |2 H5 |* T' U0 ^6 H( P$ x* F$ D3 W1 Ozip -r test.zip test/ #打包test目录下的文件
& |  `" r8 N% \: s2 a& O1 `9 Nzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录8 S& [7 A* R/ G5 F. z
指定压缩率打包文件0 \! M' p, Q4 ]- _5 N$ A5 z

  h0 k5 s  f4 @, H3 ozip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
2 W8 s4 c- s4 u" E打包符号链接文件& j" m1 D% a. ~1 L
8 }/ ^) m7 a( t5 s
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:8 u# _$ {  I8 Y' O: r& V" @
zip  -ry test.zip test
5 A+ [& \6 C: V; C向压缩包中增加或更新文件" D% |. y  y' K# }) V- R+ y

# b# `: B" S% N& B  r有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
7 X5 X( ]& V9 I; wzip -u test.zip test2 #向test.zip 包中增加test2文件  k5 |/ g: `# L. B0 ?0 G
压缩时加密% s; I& i% j" f6 W4 a* C) V( h; y
6 P, L4 l% d- G' M4 O
压缩时如果需要对压缩包进行加密,可使用-P参数:* S, ?- p, x; z: l  e3 s# G- F  B
zip -r test.zip test1 test -P 66666 #使用密码66666加密: p. q& k" s( i9 v: R
删除压缩包的特定文件
- I0 F( H' n0 s, C" F  N+ y2 x0 }* q: `9 q4 s8 n
zip -d test.zip test  #删除test.zip包中的test文件+ d& h  ^6 A% t0 v* ]5 T& b
解压0 G8 L, b% e& f, ~" G) H7 d# a
9 Q, L6 W3 P( |. F
涉及参数说明:; k. Y$ T% s) {0 Y) K2 `: P: e$ u
-l 显示压缩文件内所包含的文件
3 s  I% D2 }: g! z: \4 d9 u-j 只保存文件名称及其内容,而不存放任何目录名称。6 o8 N% x6 V! {8 ^2 ?
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
+ d: o9 F: L  g0 B- ^/ Y-v 显示指令执行过程或显示版本信息。
) n* H: _7 C4 m. {-d 指定解压目录,目录不存在会创建! _1 @: g8 e8 m% u" [
查看压缩包中的文件信息
2 V' q! D% h' p) M
+ j6 \& s+ N' ?; |  x$ }unzip -l test.zip #可以看到压缩包中的文件名,日期等信息5 ?+ t1 [" i" ^- ~$ Q  N$ j2 t; Q0 u
unzip -v test.zip #查看更多信息,例如crc校验信息等
3 O4 Q$ E' Z# \* J$ P9 Y解压压缩包5 w  G2 Q5 K  P6 R* b8 D4 o
/ N% L/ A2 d; Q4 x* j. k
unzip -o test.zip -d dir #讲test.zip解压到dir目录
/ C# w2 E6 c& t) w/ g( G$ u, m6 Z  k解压包中指定的文件
8 y: ~' \! u( [# b) S0 U$ O' D
5 G' @8 S& w2 p" r; m- x0 \3 |如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
( W5 t5 z! P2 N0 J& z4 Tunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录& V7 E  P+ \' o4 m9 V/ \
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件+ O0 N/ n! ~+ G) w: k4 Y
解压时去掉目录结构
7 }: c* ?. U) y& N" }1 Y4 [9 L- _6 F0 y9 u6 z6 S" R
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
8 T8 X& U1 X0 R9 S" \zip -oj test.zip -d ./temp  
" _6 Q+ i  S& o. y. ~- k+ ^$ m5 ]/ H2 r解压jar包
. ^: @' T$ }* ]7 I- h
' \6 @0 U3 a4 [0 P& xjar包是java归档包,但同样可用unzip解压查看里面的文件:2 S' w( u7 X! s% W
unzip -o java.jar -d dir' r% [/ {8 w- H" G
gzip
& W' M; r# r* B" }6 v7 `3 H, }5 p. k
6 e6 G9 X5 B5 }+ t2 H涉及参数说明:
  @0 k, r5 K: r$ Z) Q: d-k 保留源文件
& I+ k0 @- t# B8 u-d 解开压缩文件
9 B, \! T4 v. A# s-r 递归处理,将指定目录下的所有文件及子目录一并处理
5 l" ^& @. F1 B$ u* b-v 显示指令执行过程; i, U( [$ W5 n$ H- x' g
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
1 S3 x+ O; ?6 l7 z* e. p- S, zgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包& {' W% I3 K. f0 l2 Q# F! R
gzip -rkv ./* 递归压缩) t7 B; O" W2 m/ p# R
解压也很简单:
' V6 `  v( t# [/ I' ugzip -dv test.gz
0 B4 f) K+ ?. C" P& z8 lbzip2( C# d8 g  j% B; M

  B# F7 A( Z  `* k7 atar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
. ?# [9 ]6 I( K/ \6 H7 nbzip2 -zk test  #压缩test文件" F, }9 @( u; b+ S+ w9 S
bzip2 -dk test.bz2  #解压
4 Y2 L% R7 t$ K% Drar/unrar) c! ], S; O# U* D& P+ h( B9 g

( `# k& `4 L8 ?rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
5 t/ n( z" L* crar a test.tar test  #将test文件压缩为test.tar- s1 v) @' j! ^( }
rar e test.rar       #解压test.tar
" M: A& }2 L1 t; Junrar x test.rar     #解压test.tar
- u* _4 r6 _4 h3 R% T压缩率比较( W6 s8 N3 d( w8 I2 P
6 j/ `5 {* p/ o- R  {% s& ]6 A
压缩率一般来说:
! h+ G0 S+ E8 Y! m8 W" k7 d) ^- mtar.bz2>tar.gz>zip>tar# d+ G& x' R# l/ k: q5 k- k0 Q- B
压缩率越高,压缩以及解压的时间也就越长。
. u9 P4 |  p7 Q9 M& k0 r总结
4 @; f, x% y) u9 t! [5 `$ k: b
7 T8 b. K7 L: x对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。% ?+ i% L. a% s* ?9 T2 q
有任何补充或建议,欢迎留言^_^。
' E4 k! _, C, a/ I
  V/ ^, S/ i% B1 s1 x! Y1 u! l$ I, [. L1 f( V

' W. Q6 L, B0 ?  w* b4 e! ^
. _1 @& t2 B1 r2 y

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

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

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