51fly国际课程 (51fly.win)

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
( f, y! O, B5 P, `. }

2 X4 s5 \5 M! C( e: ~8 o

" ]; u& {4 l! k- U! H; l前言
; I# j' F, r; c$ x4 }, |) E: r* J, J; q$ P
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。* R. l5 F/ |6 |9 R4 |) Z; l
tar
3 t  v8 J6 a* A$ b) h
$ w/ ?4 T( }8 Q% jtar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。* i+ C0 @: a' s4 y
涉及参数说明:
: g) n; V% \0 Z1 O5 p' ?
-c 建立新的压缩文件& j+ W" o, I; q& `
-r 添加文件到已经压缩的文件
; ^# r0 ?/ \9 J-u 添加改变了和现有的文件到已经存在的压缩文件
8 I- G/ i# ]; L1 ~, {4 t-x 从压缩的文件中提取文件6 C- p) J* f: `- v3 j2 L
-t 显示压缩文件的内容
8 f; R8 V5 D7 }- H2 j/ E4 S; i-z 支持gzip解压文件
) i7 M$ v8 i& ^* t; S-j 支持bzip2解压文件- j) W8 E8 C1 i4 q/ D* ^
-v 显示操作过程) C/ U, q9 X, z' ^3 S& L& I
-k 保留源有文件不覆盖! U5 s1 H/ O4 W5 r, N, T
-C 切换到指定目录  r( i- m- p) z9 F% A1 u
-f 指定压缩文件
+ S0 [4 V3 T* q* H% j- [# f% \2 o1 K+ m6 @
--delete            删除包中文件' f, H2 e. ]7 ]8 z
--strip-components  去除目录- {; c+ c6 R+ w$ z: ]. ?) Q( |8 k
--add-file          向包中添加文件5 P  d* _6 u0 G  K! @0 c1 O% F
压缩4 j2 }. u/ U. J8 z% i, c! A, a9 x
6 q. H% ]5 [4 I: u- g/ R9 a$ Q
归档tar包,不压缩
$ |# z) a4 A) F, D+ @5 ~) d+ ?( ?2 R$ H/ w' g
tar -cvf test.tar test1.log test2.log #归档多个文件! m5 f6 b9 G5 s4 u/ v. A
tar -cvf test.tar test/*  #归档test目录下所有文件
3 m# K% m$ B6 J( r' Ntar -cvf test.tar *.log  #归档所有以.log结尾的文件 1 m1 V' ^3 G1 s. R8 D' y
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
" n' {. w5 {/ ^$ ?7 s# N, Q# S归档并压缩为tar.gz或tar.bz2
6 A3 O# r0 g$ w' r7 T  E$ U
+ ^4 _) s6 y  y/ }( F* u+ l& F这种方式打包对文件进行了压缩:0 U: Z; W6 q# w7 M% Y
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
; {- D' G8 y, m& q3 Ztar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
5 |2 F/ A" D- j查看压缩包中的文件
6 e2 ~5 \8 s) @: a
1 x! M$ [9 r8 X+ l如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
7 Q/ W8 T& D1 B8 ?& xtar -tvf test.tar #可查看test包中有哪些文件$ ~4 N( o/ K" u% k
打包后删除源文件0 {- Q$ C  m% |7 }) c0 o
! s& ]1 Q" E' m: v- M3 Y
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:6 b: ?& Y; R1 E% R& Y
tar -zcvf test.tar.gz test.log --remove-files
  O( k* D5 [  u% ~, U打包除指定目录或文件以外的文件
, E+ _1 a, s1 m: V' M( g
1 U: p; I$ F& G& G& z对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
+ @7 ?3 u2 l# Z& y% [$ ]8 ftar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
' g  V7 |8 g7 S, J& O这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。5 v+ U# {1 C0 F
向压缩包中更新文件
) t/ E+ g0 y4 C% Q: o4 T7 M: R" [# G% g9 c2 j  N
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
* u! P3 t. }  c+ `& T: ^6 ftar -tf test.tar --add-file=test #只针对tar包# ]* ^- m1 f8 u
向tar包中增加文件# d& \5 d7 T- i7 H' c
) ~- y& Z) ?6 X* H! g- V6 l5 Y
向tar包中增加文件可使用-r参数:7 n. @) @. @( i6 p% u, ~3 y; W6 J- E* u
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
, O# N2 a# Q" |, W删除压缩包中的文件
6 W! c, f! J$ ?0 {) E( |! k7 q9 U/ S
. n; F# U3 D% D# t在不解压的情况下,可使用--delete选项删除包中的文件:
3 z" B/ e9 i! Gtar --delete -f test.tar  test1 #从test.tar中删除test1文件
  C" t& M. F* \- Y2 s解压
0 |: O- f* w: _# O3 z) w
) @. ?2 X- j0 V解压tar.gz和tar包到当前目录0 [5 c# q& a% x8 D/ o! A/ o5 r/ n

) j2 ]3 b! O6 h3 W- I1 P4 t! E' Qtar -xvf test.tar.gz
/ n  D! l4 c' d0 q4 ftar -xvf test.tar
. z- Y9 f: `7 R) w; F; y解压到指定目录* a9 J. p3 U% o/ K& I; G% J
+ @% `: H* M2 U7 ?: }( m7 i  q
tar -xvf test.tar.gz -C dir
0 y/ U* Z9 g4 \5 m4 K$ j( A. Ftar -xvf test.tar -C dir
  a6 T8 _( ?) ?2 V解压包中指定的文件6 a$ P6 M. ^7 e1 j

$ a4 d5 [: }, u& k: m. J1 ?6 i' {例如test.tar.gz包中文件情况如下:
7 n# p' _( R0 ^5 T" i8 A9 ^1.txt
2 F9 L( X/ d" Blog/
# X+ x6 i- M/ a4 I, _4 w4 llog/1.log) ~& a' v3 m0 U9 M( F6 j
log/2.log8 V( h: }( w0 |  b" j
log/2.log
; |  C+ M2 t" e4 xlog/4.log
6 V5 t, x8 }+ @- {1 {log/5.log# m7 O# A" e+ d( ^2 L  ]( y6 C
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
+ h# Q8 M0 s: Ytar -xvf test.tar.gz log/1.log$ @: C/ G2 Z+ o% T* m
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
+ j; a5 N* K8 P8 }' k! I解压时去掉目录结构
. U$ |: U' x+ R7 H# Z6 @7 u( k+ C, w3 _
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):% r4 P! \) K( ]& x/ p1 @8 W( Z
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
5 U0 T; R0 G+ _" o' S3 K+ N4 P$ {解压时不覆盖原文件8 m8 q* p& ~" Z
  t; g, S5 `! K# Z* o9 p' s
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):7 r/ @7 W4 s8 `
tar -xvkf test.tar.gz
8 a; m! q3 v0 S: m3 T3 @特别提醒* t- r( A+ @$ J% U& [" j1 ^$ v  c

2 J; c- u! E( l. u3 i( l前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
- u1 Q( D5 x- X2 p7 D3 qzip/unzip0 c; l9 e5 z8 s+ G* ^

( }+ {: Y+ v  P+ C% lzip和unzip命令主要用于处理zip包。, V2 h$ M9 i8 T3 z
压缩
+ g5 r  B. m! p) A
, u- @# ?! |7 t3 s' k- \" _/ b涉及参数说明:
& b& d5 j0 W  @+ ~% ~* W-d 从压缩文件内删除指定的文件。
! C9 a/ [# O, _' q7 Y-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
: h4 B3 i. J* O' F7 }! c, q5 _-j 只保存文件名称及其内容,而不存放任何目录名称。. N% D3 {( {: A' x0 B
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
3 T0 L1 J( S7 W+ S: s-u 更换较新的文件到压缩文件内。* p4 C- ~5 L, U, h5 ?
-v 显示指令执行过程或显示版本信息。
9 Z! R: X: }3 p) o6 |. a% c2 ]-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。) S9 a' x, E% S, g! f( f7 ]
- <压缩效率> 压缩效率是一个介于1-9的数值。4 k4 Z0 j- G/ U6 Q& h
压缩文件
: p& `/ m) r& [! s9 `/ L  o+ g) @( ~4 p$ L+ l
zip -r test.zip test/ #打包test目录下的文件
+ D5 z8 m5 V/ J0 Z5 E6 c! vzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录+ I& N4 c& U! U( {
指定压缩率打包文件% ?6 X1 N$ s9 t% K! }! _

+ B# j: E2 v. t; v1 [+ P8 q* ]zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
) ?- h2 D6 r/ Y5 @0 {  E: K5 A打包符号链接文件7 z- n" @7 `4 p# l2 Q& l) ~  P7 L
$ m" l. W( h$ U6 z1 ]
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:  r/ T8 \- C# P* B9 d
zip  -ry test.zip test0 v8 O$ y$ E7 \* X6 Z! E
向压缩包中增加或更新文件' P, `; l. K( {1 b" X" l5 i" u! s
. @9 j8 y6 d# f; }( c
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:' F9 a( u4 h8 ~
zip -u test.zip test2 #向test.zip 包中增加test2文件
5 `3 _5 f" Y, @! v压缩时加密
( O# _. G1 u# X: _
/ f: @  k) j1 ]( Z压缩时如果需要对压缩包进行加密,可使用-P参数:
% J8 u, ^* D# K2 m) ~, p# ]! tzip -r test.zip test1 test -P 66666 #使用密码66666加密
6 ~1 H5 a# d& A7 s! A6 [删除压缩包的特定文件
4 G6 L- [- V6 \9 p( B: M* ]$ B, U1 q7 n0 U
zip -d test.zip test  #删除test.zip包中的test文件0 X) o" a1 _1 L: L9 D) Y! Y
解压  X. t* j8 y; ?: P+ U1 i5 n7 v

9 c2 ^  t/ M5 O2 r) \% I. h5 E/ T涉及参数说明:
9 B, A3 R1 T) }$ n5 H/ y-l 显示压缩文件内所包含的文件
, E- D% m1 S8 Z-j 只保存文件名称及其内容,而不存放任何目录名称。
) Y; f" N# a  ^# `0 y-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
9 m" H% [9 N4 E$ ^-v 显示指令执行过程或显示版本信息。3 L4 z( n% d" t: s
-d 指定解压目录,目录不存在会创建/ n1 v8 X4 v' ?; F' i$ h) U; W1 w3 u
查看压缩包中的文件信息7 U  S/ \& X: j  J! g# L

; g0 a6 b! \) _% b3 z/ G( Xunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
6 d$ k8 |7 l6 `8 L! R3 b5 Junzip -v test.zip #查看更多信息,例如crc校验信息等
9 F. U& ?" Z* q; @  L解压压缩包* ], M2 P5 l' ]+ X
, K0 B! i& M4 h# s" B( s4 s' E' c
unzip -o test.zip -d dir #讲test.zip解压到dir目录
- U; {& T+ I# m& [& u解压包中指定的文件; T' S6 i& t: Q, \# O

% G2 H: @9 c" x& v( P/ S" O/ n" x如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:! _- U/ f0 m  x$ ?
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录, l: I4 R: {# x5 r
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
* _' o1 ]8 u5 Z3 s, r# T解压时去掉目录结构
9 ~, s$ s( a  d  Q2 X( l1 M/ H& U3 ^& c+ P
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
0 r5 Q6 r4 K" ^$ C& Lzip -oj test.zip -d ./temp  
0 U+ S+ @6 O9 N# s6 L8 ~% g解压jar包
( M" [) h( k) i0 l, E6 o6 V
9 t2 V' m# y8 ^+ N/ Cjar包是java归档包,但同样可用unzip解压查看里面的文件:
0 J. f  ~3 d9 v" F' Z' Gunzip -o java.jar -d dir2 u" G  e% S/ B8 K& v
gzip
1 v0 V0 S- O# A2 Z- C$ `" @$ |1 C- p  ?. f. ]7 |
涉及参数说明:
" d1 z5 F3 W* g-k 保留源文件5 x, z7 c0 E* H( J6 U9 m! E
-d 解开压缩文件
: @6 r  x$ S9 ]-r 递归处理,将指定目录下的所有文件及子目录一并处理& |% `' B8 O& j) C
-v 显示指令执行过程  i# R+ S# U# W; @
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
% T3 j* @7 v. j* |- Kgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包+ ]$ E- i2 L' i6 d
gzip -rkv ./* 递归压缩
/ a$ l+ F% S( m6 l9 ]解压也很简单:1 n' Y% o7 k( ]1 |+ R8 m$ I
gzip -dv test.gz
# K0 @1 |8 W; ^; tbzip22 E+ _% u2 B& Y8 {- f

) ~/ Z5 l1 }+ |8 Jtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
; I+ J% h  w0 D. s$ }$ Lbzip2 -zk test  #压缩test文件
: M% t3 P6 N6 C3 fbzip2 -dk test.bz2  #解压1 {$ W! h2 q8 n, x( p
rar/unrar
% W5 v. R" g8 z4 K$ H+ Y+ b* \7 m( G3 Y: N9 f
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
' T' r1 c( ?* [4 Irar a test.tar test  #将test文件压缩为test.tar
1 S' \# D) Z0 L, v$ \rar e test.rar       #解压test.tar
  s  ?/ ?; t% d! M& ~: \unrar x test.rar     #解压test.tar
& D- c% z. y" Y9 c压缩率比较
: K5 r( ^$ z* ~! o' G
: C+ `% ^; _9 f) C) H* d压缩率一般来说:. p- @) d, f8 W9 g
tar.bz2>tar.gz>zip>tar
' B  p- r* [6 f压缩率越高,压缩以及解压的时间也就越长。4 i  R6 ~7 ~0 R( @& G
总结
0 W6 }( e# D( t7 ~0 z
! f# G3 N' l9 g* e对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。7 {6 c: ~: c6 m0 j8 \% X8 _# o  b
有任何补充或建议,欢迎留言^_^。
) n; P5 x- Z. w$ Z5 e2 d1 k6 m" H5 y( I; b

# Y# N" \2 J' Q# G  Q: N2 O8 z' ^- ~# v) r4 f1 o, F
8 w  T& ?' m+ S. M0 {. b% r

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

浏览记录|手机版视频|手机版试卷|使用帮助|51fly国际课程 (https://51fly.win)

GMT+8, 2026-1-8 20:44 , Processed in 0.049689 second(s), 32 queries , Redis On.

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