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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
, p7 K$ G: D9 b. U
/ I0 y& {0 r, e" E: T$ M7 i
4 m# C& H) X( E
前言
7 K$ d! ~/ C! {! @/ t( b7 m! I$ z+ |
5 S! M) V- @/ pLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
: ~: C2 p  }3 w" ytar* ~. \( o. k' l" f+ q6 _, j

2 S6 u6 r  h( `0 ktar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
' U: \: N! c, a$ m9 }; |涉及参数说明:
# {8 \/ J" H7 n/ N; ~2 P
-c 建立新的压缩文件
  G* t- ?7 a" t$ L2 E8 z-r 添加文件到已经压缩的文件2 y9 ~: u: E/ P% i$ W' |
-u 添加改变了和现有的文件到已经存在的压缩文件' e  n" J1 W* r5 E/ G
-x 从压缩的文件中提取文件; R; P" m" G5 J% u) ?0 a8 C
-t 显示压缩文件的内容+ C7 G+ q0 z% g4 [+ p: r# J: @
-z 支持gzip解压文件! H! j$ B2 U& H4 o. ]- Q; ?% s
-j 支持bzip2解压文件
. m/ s8 V1 s; U3 C* y-v 显示操作过程
4 q9 C* f# O8 z* b( m6 P1 t-k 保留源有文件不覆盖* k; B1 X2 S) U- u0 o4 o5 U3 r6 P% D
-C 切换到指定目录5 b$ E4 n- y6 l' ~0 y1 O
-f 指定压缩文件5 c3 W! L$ s! L) _' T
' X2 z4 h1 n: a5 a
--delete            删除包中文件
/ s9 N4 x" q8 i6 r--strip-components  去除目录
6 f. n! n$ \  O& R/ @) n# ]8 f* M--add-file          向包中添加文件
% V& T, [9 k# b0 g/ h/ Y压缩9 H9 s+ f" r. Y4 m+ b; X3 P% s
; q) K  A1 X+ t3 a$ e0 l' ?
归档tar包,不压缩: B- [; t3 _/ k: ^. a

( D8 M+ c3 E( Xtar -cvf test.tar test1.log test2.log #归档多个文件
: Q: B2 {( b" f" Htar -cvf test.tar test/*  #归档test目录下所有文件
8 j6 j+ S9 C! ~7 b# ztar -cvf test.tar *.log  #归档所有以.log结尾的文件
" o3 t* h( w" k, ~) @由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。) R8 f% e7 N) Y" n% N* D; k$ L$ V
归档并压缩为tar.gz或tar.bz29 c9 `2 ~' E8 @2 K/ ~
7 t9 X- D2 j/ w. U- D* @' _6 {
这种方式打包对文件进行了压缩:
7 m. H, ?# T/ B! Star -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩$ B/ Y4 Q& B% d
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩1 l6 j+ q: z. g& s9 K0 s
查看压缩包中的文件6 z" l5 Z4 X4 f: @* p
8 Z  @  Y/ e8 V/ z
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
* V+ h. j+ ^- ytar -tvf test.tar #可查看test包中有哪些文件
* I/ J; d5 A4 m8 F# z打包后删除源文件
4 J; T7 D4 d7 g: w, `$ ~# y' z( u) @6 z* P* H
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
6 u* q  e- f( m; O% }tar -zcvf test.tar.gz test.log --remove-files ' M3 w& H, g0 ]% g6 {
打包除指定目录或文件以外的文件2 ~* Z, M3 Q5 V% J7 ~$ s. f& X! h6 e7 c
' k  t9 J/ E: s
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:; P7 V; o) d* a
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
2 x" g* {# n! J3 h& a这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
, t0 b) I& {2 F2 }" f6 v. Z向压缩包中更新文件: b1 g' ^$ M/ I( i, u
  r! X$ T3 I0 ]8 s& ~
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
- A# O6 A% H5 z% p! A$ L2 ~tar -tf test.tar --add-file=test #只针对tar包
) c8 `6 V2 v8 ]2 v向tar包中增加文件
) I3 m6 w1 B$ t7 b
* T6 O+ g3 v" Z$ B; r* B7 U向tar包中增加文件可使用-r参数:
" K. q0 E% [% _tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar3 u0 i' p$ E+ n
删除压缩包中的文件; H; e" l7 X: B# m- c

) c) n& W8 o2 l/ d2 G在不解压的情况下,可使用--delete选项删除包中的文件:
  `. X) r. F& C. h  v! ]tar --delete -f test.tar  test1 #从test.tar中删除test1文件
/ y+ `; t  r0 x) b" L* |/ G解压
+ S! x2 n8 J5 J6 ?( ^. y0 a5 ]$ X! O
% x9 ^, s! Q2 T: D: T2 |解压tar.gz和tar包到当前目录% y- q% E6 Q3 [1 D) W, L  p2 H2 Y

$ l% t( O* l% |, f) V, R/ `tar -xvf test.tar.gz7 x9 y  k  L9 k# V- r
tar -xvf test.tar
1 [1 d0 @, K$ ^/ j: i解压到指定目录
' a9 J( o- |" g" r3 x" O: i
9 a5 N, L* f2 l% j8 Dtar -xvf test.tar.gz -C dir
$ K! }7 a! q9 J% H+ ~/ J* @- qtar -xvf test.tar -C dir, Z% r' {3 c: H: i; P0 l
解压包中指定的文件  L. g6 D3 H- C; c
4 C4 ]' v+ Q, v. z% N+ v
例如test.tar.gz包中文件情况如下:
% l* ~0 z6 a% W1.txt. k, n+ u$ R! O4 \9 T- T
log/
% b) E* x, _( w. H+ e1 t9 Elog/1.log2 s- r" v' o2 `  X! @" `* B1 _
log/2.log1 _! t* X  O" {# i+ k. ]
log/2.log
2 O% C3 V& _4 e7 M& zlog/4.log8 @8 M+ R6 n! A9 G  N# C) B
log/5.log
, P6 F" R9 q3 B$ r% }& {如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:' X4 d& ]6 _6 v* q, {7 R; v6 z
tar -xvf test.tar.gz log/1.log" E9 p- ^" _9 n8 Y
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录1 L- g, E0 a7 O+ P
解压时去掉目录结构
4 b# B! x  x4 m; O- H
, W. A8 C' n8 A; Q! t压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
( j+ @' S' n9 z% B4 Otar -xvf test.tar.gz --strip-components=1 #去掉一层目录% Z" w* C5 _% }* \! [  w" i3 G
解压时不覆盖原文件
  V# o  y8 m" g' |/ k; B- Z8 _
' }' }9 W1 L3 s  G1 G当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
: ]9 Q* p/ R0 S8 ~8 vtar -xvkf test.tar.gz3 D, x  |( l9 C. j4 D
特别提醒0 f7 h0 v5 s3 T+ w& O8 l4 O
- a5 h+ f. c3 b' u' d# R5 l7 L2 t
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。& K+ y: W+ _2 y, N! T; u
zip/unzip* A6 x( M6 ^& F7 E& B( I, n
0 [& W% r; S+ D
zip和unzip命令主要用于处理zip包。
- N7 G6 i& E: K8 k4 q1 e- l" ]& U$ A5 j" [压缩
$ Y, q1 ^9 }. d+ ?( ~) v8 r9 _' t% B  |; E9 w$ B
涉及参数说明:% p9 X4 F: r, U! y" M- R9 X: ^
-d 从压缩文件内删除指定的文件。
9 U% b) s5 b0 p. D& w-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
2 |# D! W! k' F, I9 ~+ S1 a' s-j 只保存文件名称及其内容,而不存放任何目录名称。' W2 S) _9 j, J
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
: e8 V  H# [# s0 z) M$ w: P! F4 u$ J-u 更换较新的文件到压缩文件内。
: O# p2 q; G8 L, y  M* }# d# m/ k-v 显示指令执行过程或显示版本信息。5 E$ L+ w7 N$ n  F# k8 H( r* f
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
  [( F; N  o4 @4 i0 c- <压缩效率> 压缩效率是一个介于1-9的数值。
' ?9 A* I7 _; [! K  y' L8 \8 }* F5 o8 K压缩文件
- J0 X5 t; e! p4 G+ V! J# D7 \/ r# p5 @+ E" O
zip -r test.zip test/ #打包test目录下的文件
: F, _5 k8 a0 k: G  Q5 Nzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录# K4 Z; g# B9 R3 d
指定压缩率打包文件$ D2 L* K. p9 H
' K/ Q5 ^& M3 L* E' }& }
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长0 T9 P$ J. S' e9 X- g
打包符号链接文件: D/ R( v7 M" Y* _: `

8 G5 A% B% ^  Z前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:( W* I9 `. J, _" y4 P
zip  -ry test.zip test
, L% l  Z4 T+ G7 K% C7 i8 f向压缩包中增加或更新文件8 U3 J# _3 v% J; M
3 W+ U+ x( z  X
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:( p( W- I7 {( e' I" l8 f+ P
zip -u test.zip test2 #向test.zip 包中增加test2文件  n6 x6 U9 s+ r1 U
压缩时加密+ L! {: S, x# \" q% C
2 H( O* P2 K+ t) T
压缩时如果需要对压缩包进行加密,可使用-P参数:
/ d+ n4 ~6 J  w: w+ K$ qzip -r test.zip test1 test -P 66666 #使用密码66666加密; f- G; @. n  L; Q
删除压缩包的特定文件
' a/ `0 a3 q" O% r3 L+ r" _9 q8 _
. P7 G: {, O+ I. ozip -d test.zip test  #删除test.zip包中的test文件
5 v8 b3 I$ ~" @# p( a. o" k' V! V解压5 ?: b( [! ^. }6 n2 c& ?, @
  Y5 t$ w- v9 c3 e& s
涉及参数说明:
# }9 Y3 d( X) l& I-l 显示压缩文件内所包含的文件9 w7 y! b7 F2 _" Z9 R
-j 只保存文件名称及其内容,而不存放任何目录名称。, G0 ^, W$ ~6 N: ^- Z$ ~% I
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
& y3 {5 k9 l# d+ I8 B5 G2 @2 B-v 显示指令执行过程或显示版本信息。' F1 T  \/ I* M& s% o
-d 指定解压目录,目录不存在会创建! d! R" a: `) }3 s
查看压缩包中的文件信息
. I  j2 [1 l7 a( Q4 `4 c0 i% F/ F; A5 R) o2 _* ]: i6 V
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息5 L$ L! S0 p& H3 n
unzip -v test.zip #查看更多信息,例如crc校验信息等
% B! J; a! f. [2 ^  D8 M2 x2 I解压压缩包
' @0 c6 `5 [( c# u
# @. L- |" M, Q+ x% runzip -o test.zip -d dir #讲test.zip解压到dir目录
) S8 |: T. o0 H/ y; ?" D解压包中指定的文件- V2 l+ a0 b! M

, a" h9 B4 V  M" L8 d( ~3 u! m6 f. }. D如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:; J2 f/ `+ O' T' S) Z/ q$ Z
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
: K9 s, A0 t* Q/ junzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件; Y4 q  X. W8 [+ ^
解压时去掉目录结构7 e& K: O2 ~, w

$ i9 `' G8 `( Q* `5 C* h  r* k3 p压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:, T' T1 t+ o! W( ~# r$ J3 ]" e5 E
zip -oj test.zip -d ./temp  
; |3 V6 |0 P- V, W% _解压jar包6 d; s) V' i5 V
) X4 m/ w7 H( D5 ?: q' `4 d' _2 r
jar包是java归档包,但同样可用unzip解压查看里面的文件:2 s( v2 Q# O% ^! {
unzip -o java.jar -d dir0 V8 x% O: K) n3 ]: n2 A: S% i. ?( R7 Y
gzip
9 S' h! r- r# l, ]/ Q; N
/ U, ]2 Y) _( X  b! o& x涉及参数说明:
/ C; W. S  w) q0 s  u-k 保留源文件
5 F, [; O. k/ U' y! e5 R-d 解开压缩文件
1 m* z( A& X7 j( }: [9 }. ?-r 递归处理,将指定目录下的所有文件及子目录一并处理
7 q! B! e; ^  z( T% t2 [; v-v 显示指令执行过程" [/ _. M( Y) b1 Q
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:2 |! G& i6 [( g0 Z$ t# c$ n5 Z) l5 ^
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
4 Z! P& ?/ B2 J3 j6 W& a9 Cgzip -rkv ./* 递归压缩
% H+ p* i( a# F- G" J/ g. r' O1 M$ |解压也很简单:
- g. F+ ~0 v6 a, E5 l( w  [gzip -dv test.gz $ Z, L" K+ G9 A$ T
bzip2  a6 B. w' z, A/ K" I

9 Y0 g0 I0 |" y. G5 mtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:$ F& Z* w% Z0 W
bzip2 -zk test  #压缩test文件/ ^# E; u8 l2 ^; [! R
bzip2 -dk test.bz2  #解压) [+ V  L# W" M& e, |
rar/unrar( b! s6 H+ {) t; q' v

1 t: V4 m+ r) f2 y9 V& ?rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:; e0 @* a  x* N
rar a test.tar test  #将test文件压缩为test.tar
* X* o; k! D+ P$ j( ~5 ~3 f  R( s  Rrar e test.rar       #解压test.tar
! H* A" w. ]. G# Vunrar x test.rar     #解压test.tar. m$ h/ K6 k- j
压缩率比较% H+ p9 K/ C2 c9 q  u8 M
/ d* `+ ]" A9 D# r2 ?7 O9 R
压缩率一般来说:' K1 E/ K" l. U; |% F1 B- G, G9 E7 ]2 Q
tar.bz2>tar.gz>zip>tar
4 C2 ^/ R! F. \! ~; J: `1 U, p压缩率越高,压缩以及解压的时间也就越长。( D3 |1 t. A3 \' `
总结
' q7 b, W" r+ p, ?* _! p' k. @6 x1 Q% w: \7 q5 i
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
& U9 g3 G' J+ m3 W' O8 J! k有任何补充或建议,欢迎留言^_^。
, M6 c) U  c! N. D1 p4 O9 c9 A/ o
. Z: s  M; n$ @# ^  F0 @

) U) j1 k( T0 l' `* [

  D0 r8 R% i6 Z: r3 w3 d" v7 c3 c

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

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

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