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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

6 \4 E+ c; I1 H" E* r* i& p* N( N' d. y. F

6 Y# J) }9 g/ U0 H' B: x' I( ]前言- V4 k$ D1 G! G
/ V9 r, G$ D- S, Q+ p! E7 A& o
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
: k1 c. w' `( i4 ^tar
( _$ J/ r  `& U/ \, I" a; {) ^5 ^% B# c, u
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
- ~- B, Z  l& {$ R# ]! d: z* W涉及参数说明:

. ^/ \5 y! Q' A+ F# v. ]2 B-c 建立新的压缩文件
. p5 Z+ K% d1 l& a& s- m; c! t- n-r 添加文件到已经压缩的文件1 k+ E2 K  i! R8 e2 |9 x* y
-u 添加改变了和现有的文件到已经存在的压缩文件
; P1 \1 x# ^; H9 S3 e9 u: C-x 从压缩的文件中提取文件. _+ H" o% X9 Z- v; a
-t 显示压缩文件的内容7 y! K% G. o% b2 _$ g7 ?: S- B, @
-z 支持gzip解压文件  a' b# `  p6 B/ y
-j 支持bzip2解压文件
, j8 q+ ^8 y, k' f: z/ ?-v 显示操作过程
4 {% h! k$ \0 Q: X-k 保留源有文件不覆盖( C' a1 ]% ^* g/ V
-C 切换到指定目录- s7 O% G7 q$ r* Q
-f 指定压缩文件
+ Z1 O4 C" J, |3 E9 B. I
1 i& }) O. B8 U( n--delete            删除包中文件
" V2 z+ Z# K6 L3 K9 `( Y--strip-components  去除目录
! L2 d$ e  B) f9 Q) u--add-file          向包中添加文件% J, E4 ~9 S) q
压缩* t3 V+ ]9 Y5 R0 W8 k* q

. |1 g$ c' ?- Q归档tar包,不压缩2 G. J9 p" ]1 I% _  [2 M3 I( M

6 q7 r9 W- Z  R" u% g  G6 m( qtar -cvf test.tar test1.log test2.log #归档多个文件
; ?( v' o- @- qtar -cvf test.tar test/*  #归档test目录下所有文件0 @+ `# B+ K8 d: t% n
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 ' `+ {) P; D& R% F
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。) V9 j# v8 t: D/ f9 M
归档并压缩为tar.gz或tar.bz2' F4 l  ?2 K' n6 R+ w# f

' b. f& `6 q, v' U# d' X, D这种方式打包对文件进行了压缩:
% ^' @( b$ W# i8 \' _% t0 gtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩) g" w% Z5 X$ H% d  U
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
* ?% x' X- a( [* q! }4 p& o查看压缩包中的文件
) P% F* V' K! X% J) G4 u6 j
' [. V0 ?# n/ s) D如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
. g% @2 T; K. l% j% B4 Ntar -tvf test.tar #可查看test包中有哪些文件5 w% h$ O5 `2 X( O( P: K* G
打包后删除源文件
  J5 m% P$ R: P" E& N1 {% D# @' a; N$ F8 B# m" j
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
. }$ k% `; F. W5 h/ b% A5 k) htar -zcvf test.tar.gz test.log --remove-files
# M* x  n( [: A  V4 @打包除指定目录或文件以外的文件2 |" |/ o+ x6 W3 q& ]. n% D

. ?& e( H8 ^* H$ V对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
2 Z/ A" v$ ^8 X- j& G! h3 htar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
, k8 }' k( j7 _! }这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
$ ]) K* w- r' z* A向压缩包中更新文件* d3 t& \! o8 s2 ?) P( H

; o" s3 m3 b* O1 t. G例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
1 J, t" T6 R% P6 O) _+ \* ttar -tf test.tar --add-file=test #只针对tar包
1 E; w& Q8 b6 ~+ y7 S: @向tar包中增加文件9 d4 E6 h, m* K" Y% s) R& Q

8 T6 i0 e+ N9 D9 o6 _! X6 m) `向tar包中增加文件可使用-r参数:! d! d. k! c* U* X9 d6 r6 A
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar( l8 \! Q/ w; x
删除压缩包中的文件; J8 u# @3 W/ q" Y
; Z( D/ X& I) A* m0 w
在不解压的情况下,可使用--delete选项删除包中的文件:
$ A* H) M. Y  f! P8 m2 ~$ Q( Ktar --delete -f test.tar  test1 #从test.tar中删除test1文件
* A! n3 G7 `: k+ Q3 B% ]# e解压3 p+ S# ]  T" R+ z" o/ I- I1 t

. ^" A) ]5 C: m( x: u3 R2 X解压tar.gz和tar包到当前目录
" _5 ^9 i2 r, K0 b. d
4 h7 z' a9 j) H# R+ T5 u6 p# Vtar -xvf test.tar.gz
1 k5 W# x  |: D3 j: U/ |; Xtar -xvf test.tar
/ S: `' q; i! ?5 k! r2 N( z解压到指定目录+ i- |9 X- d8 D6 I( f

5 Q, r6 t9 V! q( T' _tar -xvf test.tar.gz -C dir4 q" k) |: _) _. c- X2 ~6 H
tar -xvf test.tar -C dir
# z/ H& X" ^+ ]) _) B) J解压包中指定的文件
+ r: s3 ~" P, Z; X% [
8 y' E* G3 K/ m8 ^4 f  `例如test.tar.gz包中文件情况如下:
+ |8 m1 H4 b3 \2 k% |1.txt
  c7 J6 P5 t& ^8 `& O" r" v5 Ilog/
3 ^  C7 c$ Y6 ~0 O2 \4 Rlog/1.log
! G. G( ^! x! p" ylog/2.log
9 W0 P7 G8 K+ j' }0 Klog/2.log. h4 c  ?, C& Y2 \
log/4.log
' n6 ?# j! k' e5 hlog/5.log
! g, z, i7 P9 W0 B3 K1 {如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:0 ^. a, T1 s: m6 h( D- N
tar -xvf test.tar.gz log/1.log
0 k2 \( r# p0 y2 o- ^! o. K! ctar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
& u8 u# o0 X+ ^) B3 K+ e+ S' f解压时去掉目录结构& v% j$ J( F3 V( r2 \6 C$ P2 @

! D3 ^0 _, h, ?1 `4 t8 y压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
! @, Y% w, r# C* X! T0 ^6 rtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
: @1 i" T% O% \$ H" {$ M/ C. E; B解压时不覆盖原文件
' Z. J( C) \: k' |/ w- S( ~% W/ Y0 U! d9 }, V" _
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):$ [$ W$ {$ v; a/ t' @( @% t' w3 m
tar -xvkf test.tar.gz8 m! E3 K( s8 z5 M
特别提醒3 R1 i/ O2 J7 Z  p: j; s+ W3 m8 d7 g

% L: e+ L6 X1 S1 K% ^前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。% d: @$ A- d/ l$ \, b2 X
zip/unzip! g. h+ X- M, e$ ]' c
& Z2 w+ y& a) G
zip和unzip命令主要用于处理zip包。
$ ?/ N* g) E  p# @5 |4 E; p0 I压缩
7 Z4 Z7 D! z3 d$ H; Q4 C" H/ V9 n/ T/ y/ q3 B
涉及参数说明:3 S2 t, z. q6 J" g! s
-d 从压缩文件内删除指定的文件。& |7 q4 z/ K5 L3 n
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。0 e+ Z  e: X1 P' a
-j 只保存文件名称及其内容,而不存放任何目录名称。: Y6 D/ x6 F# B3 a% V
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
4 ?  M  ?+ L3 Q: u( C-u 更换较新的文件到压缩文件内。8 V0 E9 X! M) p  }* G
-v 显示指令执行过程或显示版本信息。5 n  [3 A% O7 u# q! K# z; M
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
5 O7 a$ @" I' v3 r- <压缩效率> 压缩效率是一个介于1-9的数值。
8 q8 M, E- z1 l- w压缩文件0 @/ X5 w2 f( U

& Q+ G- Y; \6 w3 Vzip -r test.zip test/ #打包test目录下的文件
3 }8 x2 d" Q' vzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
" V5 A/ \5 f: S  |4 Q  q指定压缩率打包文件$ ^9 n% T" u, _% Z# ~2 _- J6 R
' R( W+ ^3 U' y3 b( d7 u# z# X
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
. P6 r+ h; v+ g4 c打包符号链接文件
* D! x$ v+ Q3 z. o# U, V7 q, {# {  S3 B) H: a7 O4 ~8 R! k# H
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
: h# N9 b0 M8 E- D( w3 e0 }) g# Z# Qzip  -ry test.zip test# W: N4 N8 S) ?' ^7 P
向压缩包中增加或更新文件
. C3 U- o& F" h; N9 z- M: l3 _' v( X2 }. C
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
. P& t9 l- J8 N1 T9 z4 [" J2 `zip -u test.zip test2 #向test.zip 包中增加test2文件, D9 ~, s4 `  T$ x! k5 o
压缩时加密
: u0 k' S( l# a9 A5 @! W4 ~2 O
$ A% Y3 e: E* ]3 Y( r9 |压缩时如果需要对压缩包进行加密,可使用-P参数:' e, b8 }' f' v( w0 H9 H! P7 j
zip -r test.zip test1 test -P 66666 #使用密码66666加密  R# x# B: l4 s2 C, {
删除压缩包的特定文件
) r5 S9 C" R* y! d' ^/ M6 @0 ], X( Y  q; D% O; x
zip -d test.zip test  #删除test.zip包中的test文件
/ M5 @0 |9 B- h. e% s1 y" `5 S& I解压, U$ W' `: M% Z# S

6 G$ T2 Q. W2 M) S# @$ u4 D涉及参数说明:( B! N3 q1 c. k2 ~4 P, u
-l 显示压缩文件内所包含的文件  O  D( N) _: j& q. {! l% n
-j 只保存文件名称及其内容,而不存放任何目录名称。2 X7 x+ d# }4 {) P5 y0 E
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该! ~6 y) Q" T- E' |
-v 显示指令执行过程或显示版本信息。( M0 O4 A1 v" }! _3 W, p
-d 指定解压目录,目录不存在会创建4 ^( U2 C) ?# x5 |
查看压缩包中的文件信息& I$ Y2 Y9 k! f5 c4 h- M, }

+ f- ?6 z! B$ k: Vunzip -l test.zip #可以看到压缩包中的文件名,日期等信息% D9 |& W0 a+ T6 U( P- @2 U
unzip -v test.zip #查看更多信息,例如crc校验信息等5 X& C( i" e! g$ @% B2 _
解压压缩包# N- U2 N& H5 ^9 @0 R0 B

, z7 x$ J+ ]) G: b5 H; }* S$ dunzip -o test.zip -d dir #讲test.zip解压到dir目录+ b+ g0 K& p  B! z& B9 W: i
解压包中指定的文件7 M) g. D; ]- i

  s! a4 r6 T1 ?如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
  z, I' |: W9 t, ?2 tunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
2 n' l! G& `$ r' v! N9 ~' W: Junzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件/ v5 |9 [7 @0 {, W
解压时去掉目录结构9 R- ]: f, w* y4 Q  D
3 Z; C6 b0 U) Z% c) r
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:. w4 N' |2 J1 k) P0 o" J! y' a
zip -oj test.zip -d ./temp  
. w6 P/ \( Q1 q解压jar包" Y$ `" x9 r8 g, l2 R) Z

3 Q9 E& e; [* S( Q6 Pjar包是java归档包,但同样可用unzip解压查看里面的文件:5 |1 n# r/ m+ v. V
unzip -o java.jar -d dir$ s. o' R9 A' }
gzip
5 t0 [5 M4 E" }, {- Y
5 s% i$ I8 F4 B* h% C" A0 K6 K1 A涉及参数说明:3 X5 }% h: V8 b( L
-k 保留源文件; ]8 M* \) w# U
-d 解开压缩文件8 Y4 p% l! S2 K' J' Z- t9 G* N& ?
-r 递归处理,将指定目录下的所有文件及子目录一并处理+ h& D5 j% v& r; @6 D, ^
-v 显示指令执行过程
- g# h( c9 `7 a0 j7 C: jtar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:) E" ~  v+ j( ^. w( j& T5 k
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包+ Z5 n, M/ d1 X7 t4 A) T9 W
gzip -rkv ./* 递归压缩
. R5 H8 ?! i. ~' E# `. W* F3 y解压也很简单:1 r0 {2 v4 ]. m* W7 Q* r& x
gzip -dv test.gz " F4 [8 N/ V' j0 E
bzip2
! c! l) e& x8 s5 y! Q; P$ [4 `+ V$ a& b, o& F9 m: a' m
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:" I5 A& _- z* ^# w: G( T0 P
bzip2 -zk test  #压缩test文件
6 T. D! B/ A* g4 k* mbzip2 -dk test.bz2  #解压
+ S& S% m/ x3 |: C1 }% k9 \rar/unrar/ A2 `7 W. x. T/ t% ?+ j3 u
+ t& x3 F# x+ P9 s" j3 ?
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
1 i; `& p& D; r" prar a test.tar test  #将test文件压缩为test.tar
5 J9 G# H  @& C# @1 n5 O" q& E& l* a& lrar e test.rar       #解压test.tar2 a$ t  V- W4 P% K) }5 ^3 J" s
unrar x test.rar     #解压test.tar
9 J2 o, X+ x% l' s: }8 B压缩率比较' i+ O. |9 K9 M7 v

9 l3 Z9 C. h4 q+ k: j1 h0 j压缩率一般来说:
! q) j+ c" |0 L4 ztar.bz2>tar.gz>zip>tar
7 |0 W# d- C& b" |* S% W, r* z压缩率越高,压缩以及解压的时间也就越长。  f, H7 x" J0 `9 R/ D8 T
总结
' z( y4 B- {7 x/ q3 N! q" \2 J' N! c5 x. f- q9 M" Y6 l9 W% d
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
: G- w) M$ T- a  m: @. t3 K0 Z有任何补充或建议,欢迎留言^_^。1 z/ J5 [5 {$ {4 a" r  W+ k

9 t, W+ y3 U9 ~: s; S5 \( A
3 S. F) D& A7 ?" d0 m' ?+ b2 o4 ^: S9 H$ Q. Y

& Q3 Q5 V/ @6 B# z( f

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-21 08:00 , Processed in 0.076965 second(s), 46 queries , Redis On.

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