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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
+ k- K2 u5 {# T& \4 T
9 {2 l  j2 S6 k+ b3 h9 I

. P, ?5 t/ k  K9 @5 ~. h( N前言
7 @7 Y* o  E! L5 ~4 R5 p- [& ?4 a
$ X/ I% e/ {$ _1 B! C# m4 l' t: [Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
/ n( e- N" U% U( V, A# Htar
  v9 T4 k  x/ {2 b0 P, m( L% R7 s+ B4 h: s2 t% n2 H% p$ r! Y
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
' U1 D* j! U' ]% t涉及参数说明:

* s9 m$ J% _" }. \7 s- ~-c 建立新的压缩文件# t; \  ]! B: r8 A) s% Z
-r 添加文件到已经压缩的文件/ }) k2 Q8 p+ C$ v/ q
-u 添加改变了和现有的文件到已经存在的压缩文件- ?# ^" U  k2 R: L- c) v
-x 从压缩的文件中提取文件! a* u! R7 Z; {% r
-t 显示压缩文件的内容0 V/ ^9 n8 r, E; l, E6 {( X6 M% W
-z 支持gzip解压文件
8 T  N; ]/ w, Y$ @% s( x-j 支持bzip2解压文件
# w  l; @5 N& W5 ]4 T-v 显示操作过程6 G, ?; O! u) H# f9 R) R
-k 保留源有文件不覆盖8 }4 z4 D1 a# W* q
-C 切换到指定目录
+ }- Y4 e: l9 c8 R) M-f 指定压缩文件
$ M9 f8 V+ u3 S
0 P6 b# }" D4 c5 R--delete            删除包中文件1 s8 P' v' X2 \% v$ M
--strip-components  去除目录: A& {) H0 h9 Z. ?0 Y1 ^
--add-file          向包中添加文件
1 x7 o9 X* c1 `8 j% B1 w压缩
0 F* v3 ^' A' `8 G, I# C6 r8 O& B
归档tar包,不压缩( t+ {! d: h' K4 A

  b4 V) c% g  vtar -cvf test.tar test1.log test2.log #归档多个文件
; G4 X0 ?5 ^  ftar -cvf test.tar test/*  #归档test目录下所有文件
, [2 x. L0 j9 Q' Z$ Otar -cvf test.tar *.log  #归档所有以.log结尾的文件 & T+ ?: j1 q# W0 p, c: ?, N" ^
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。+ {* p- H9 W8 b& g( {
归档并压缩为tar.gz或tar.bz2
+ F5 }5 f& E. d
  C6 J* W/ `1 x- c! |这种方式打包对文件进行了压缩:0 t9 l0 Y+ m$ d4 M* I
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
: K7 `: q  w% {  `3 c/ otar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩3 J( C7 G2 z& D* H7 b9 v0 C' p
查看压缩包中的文件" q9 H! o% i+ w3 x( y

- |) j+ a9 N6 W$ h0 W; }如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
% f5 l; B5 Q- t3 k/ @tar -tvf test.tar #可查看test包中有哪些文件$ a7 D8 L: }1 m7 h" A/ }6 E
打包后删除源文件
% d& Y- J* b- X4 W
. G' K$ Y2 K# o$ i# v- C+ J有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:3 l3 a9 S+ c- V
tar -zcvf test.tar.gz test.log --remove-files
, \3 Y% y; M# A9 Z7 n' k8 [/ }打包除指定目录或文件以外的文件
6 c8 h4 S# {& g7 w5 E' m, Y; Z9 J  o  \! Y6 w( `
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:& @- z; X1 }4 c% P& `" P) F) \
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件/ [! M" s& F/ p  C. n% [
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
$ y4 K4 p3 n, f+ T向压缩包中更新文件
( \* v5 J2 U, u) C
* ?0 R: c5 n; ?例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:# x% g! Q9 c! r2 N( L$ [- h
tar -tf test.tar --add-file=test #只针对tar包4 U& R8 X3 Y$ I3 s/ K! `
向tar包中增加文件9 Y7 M, \0 X1 w
# ?" w" a6 T9 X* g( M* z2 G' e; E
向tar包中增加文件可使用-r参数:5 a. I) P. |7 |# z2 ^7 @$ n2 r
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar! W( J" y& i" o* y$ s4 [' ]. I
删除压缩包中的文件
# q- T$ R3 B  i0 [/ F' _5 X% X, G7 K; w% h3 o
在不解压的情况下,可使用--delete选项删除包中的文件:9 f( i- s* I$ ~" z$ @
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
" t2 _+ g2 V8 m, J. [0 H% F6 j解压
" b. k2 d: G0 S; l
: e1 p) k2 C' c9 a0 j& l& F解压tar.gz和tar包到当前目录  T7 _' c& j1 j' F

$ `& M0 U7 j# \6 L7 J, D- mtar -xvf test.tar.gz( x! [: v5 \, `& w/ ?8 L& }0 @" J
tar -xvf test.tar
4 x% b9 ~3 B7 K9 {7 k* b解压到指定目录$ C2 {# E/ _+ n; W3 D

/ `4 I9 q" c, A& m5 ?tar -xvf test.tar.gz -C dir
) K% |5 s8 c8 z$ J( G2 etar -xvf test.tar -C dir$ n* ]& r1 t) E. |+ Z. {- c: ^
解压包中指定的文件% L2 g+ t, D& x4 K% _
1 t4 N$ H0 Z' L. i7 b
例如test.tar.gz包中文件情况如下:
+ z) H0 @) m: k; r* W) w1.txt
% y0 G- q$ Q. h- @, Y! vlog/9 [4 g) W. J0 R7 v, _7 Y+ ?
log/1.log
7 d2 G' s+ w9 E$ k0 f& mlog/2.log
$ r1 b( r/ U- O8 w' A) Qlog/2.log
( L6 o1 D9 h* v4 D2 A' V) U- tlog/4.log8 w& \: D- J: J, Z6 p
log/5.log
* |/ \& y8 S# G; \如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
  c; n, o3 z9 M9 d; htar -xvf test.tar.gz log/1.log: L) W) P  A, ^" n' Q/ m' b  V) d
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
7 j/ v: q8 r: I解压时去掉目录结构4 I% |6 |' o  S/ L5 t8 `, N

& W0 p: r; W8 p' H压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):' B* o0 }$ X5 |# l
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
0 f9 I3 M  D; c+ T解压时不覆盖原文件
" i8 {( i) |& E6 y# H4 t- h7 T$ ?& \( O; W; W/ p
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
+ G; M7 g+ ?! y$ I# ttar -xvkf test.tar.gz4 t* {' f3 z' G5 [8 Y8 T5 u
特别提醒
/ I9 E& G4 I; V7 A: ?2 V4 n5 m5 [( P, c- U2 A" e# C2 t
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
( o* o' `) r1 y5 c  R( P' ~8 C; O* zzip/unzip. O* R2 |  h& R  ?6 W0 y% }& r

: H! x0 v6 F3 c( a- K0 lzip和unzip命令主要用于处理zip包。- |  U8 S0 ?& I2 m6 Y8 a% {, J
压缩  U+ `% N" \- s

2 ?7 u% L& s$ d# z3 V7 L涉及参数说明:
6 F* u# J6 t- y, `+ O4 S* d-d 从压缩文件内删除指定的文件。
3 N6 a5 F! A- e( t5 g-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。" n4 ~- Z  _. I) ^* r1 ~  Y  g
-j 只保存文件名称及其内容,而不存放任何目录名称。7 Q! a5 \% K# d- D
-r 递归处理,将指定目录下的所有文件和子目录一并处理。6 H3 S- p% d) I
-u 更换较新的文件到压缩文件内。
( _# o- v2 @: Z0 c3 K' z3 H" W% m-v 显示指令执行过程或显示版本信息。9 S  B& h0 V+ B* P4 r8 P. [* n  a
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。3 C- ~. `. t$ V7 T+ _
- <压缩效率> 压缩效率是一个介于1-9的数值。/ i  z$ x. E5 W7 n  R7 k
压缩文件: a" `  d* y# B, w: ~7 ~0 f

% s" b4 ~6 n# x( P+ Gzip -r test.zip test/ #打包test目录下的文件5 D* Q9 r& v# r2 s/ U) t4 a
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录" W; f! l6 ]+ W5 a7 B0 v$ T
指定压缩率打包文件
" {* \8 U* j4 P; k- N8 Z
8 O/ ]: M6 Z4 q) lzip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长7 x! X3 x3 H2 D# T2 \# D
打包符号链接文件1 ~/ f/ S$ m  J

! q* A7 E) K" z8 |前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:  e& W3 I* H- I& D
zip  -ry test.zip test3 u% J  J6 J6 U  T
向压缩包中增加或更新文件
0 E! y+ O5 K" _8 p+ B) j, Y% T8 U' c0 a- P4 ^- q' R) z
有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:- I! C7 e; K" ^9 z. ~3 a5 P
zip -u test.zip test2 #向test.zip 包中增加test2文件8 C$ f; j. r. A9 Y- b4 f
压缩时加密+ ?2 p2 l& e  @

# f9 R+ b( _2 F; A* ~: z压缩时如果需要对压缩包进行加密,可使用-P参数:
: S# a6 [  K' j  ~zip -r test.zip test1 test -P 66666 #使用密码66666加密3 F* N2 T/ K) t& h/ e$ N5 H3 D
删除压缩包的特定文件
& `0 {5 E0 d. [' k7 ~" F: c: p% I3 e! \
zip -d test.zip test  #删除test.zip包中的test文件1 _. k0 j8 P2 m4 x" P
解压
3 P- M4 v- h9 F0 W" F  V+ c
5 [; y, _; C' T6 u' p# j  o/ E涉及参数说明:
3 }0 X5 {$ M; e! p& _-l 显示压缩文件内所包含的文件
0 v5 ~( U7 T5 B5 e4 t: N3 j2 n1 ?-j 只保存文件名称及其内容,而不存放任何目录名称。4 P9 T! Q3 M& _2 a. e( E  L
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该1 A4 q& Z4 D( [- ^3 X; L
-v 显示指令执行过程或显示版本信息。1 w: q+ m& X) D! G& T7 q
-d 指定解压目录,目录不存在会创建3 e  j* ~% P1 s5 O" L( ?! [
查看压缩包中的文件信息" p! H( I8 v, ^* y2 \1 a) @

6 O; x; f8 R* Eunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
! Y9 |- Y/ i! M# u! k5 _" x  ~0 Iunzip -v test.zip #查看更多信息,例如crc校验信息等8 D$ O6 B% H5 B
解压压缩包" b. t1 W! b. T3 B' M. m& p

* L) ?  z  l$ [4 p7 W7 ^unzip -o test.zip -d dir #讲test.zip解压到dir目录
+ e: m; q3 T2 q' e* k解压包中指定的文件8 D! f% N/ L4 y$ u% r' P8 X
- Y1 F% d( ~6 `( U( ?
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:$ n; g- G) Z. x2 |( \( t
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
4 i3 ], L; v5 w# funzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
4 y+ F! {* r! l- U3 ?9 @* j# ]# F解压时去掉目录结构
4 K# H( e9 C, m5 _$ v, ]7 x3 S1 ^# j% F3 o
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
2 \7 w7 u/ O" S5 q; h& jzip -oj test.zip -d ./temp  ) n+ z, K# `9 a. `: [6 K1 i& r  T
解压jar包
$ e1 {! s, i& y/ I) b; x- w  ?' F( [( z3 t7 W3 X7 A
jar包是java归档包,但同样可用unzip解压查看里面的文件:
( G3 h% z$ w; C. b) _+ x5 Nunzip -o java.jar -d dir: Y. p: ]( l7 x/ T5 N
gzip' j* ^3 W$ h% T

5 ]+ i% G/ G. o9 s- I7 Z涉及参数说明:/ ^/ E6 C1 I1 t, H" p6 Z
-k 保留源文件5 S* V% Y& i( _% `0 ?
-d 解开压缩文件
7 l% X% p2 J# S-r 递归处理,将指定目录下的所有文件及子目录一并处理: m0 b. ?3 R. X; M+ U. t) ]
-v 显示指令执行过程
5 P+ V, l6 F$ O) Z/ ^" Ptar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
! C; @- q, q( n3 U$ Q# y# B' _* o% hgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包( ^! w$ F# a) t
gzip -rkv ./* 递归压缩% E+ f' S* v# U" [; S! R, o0 w
解压也很简单:4 r% q" N# _( l+ y  b
gzip -dv test.gz
4 T( ]4 E4 E- C0 T' o( vbzip2
3 P' l4 ~& i9 I1 n3 U2 E
0 B9 Y& s0 M) D1 n' _" ^0 `tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:+ ~7 z& {# T: n: [- m* f8 [9 g
bzip2 -zk test  #压缩test文件
) A, F( K) b7 \8 I/ c+ Q6 L1 E' Tbzip2 -dk test.bz2  #解压, j8 d" B6 A  c5 Y: `6 d
rar/unrar
, ~. z0 _, E3 {1 f% ]- S8 ?; k: F4 a$ R8 E
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
% X) N" ~5 [7 _# q# arar a test.tar test  #将test文件压缩为test.tar5 p% D! m0 ^! D
rar e test.rar       #解压test.tar
3 p: r/ C" I! e3 Z) ~! g( xunrar x test.rar     #解压test.tar
, K* E8 ]/ H- i/ P) ]3 w压缩率比较6 d( D( m' G9 I: L6 ^- ^

' Z6 E" N7 N  d" e% v2 S压缩率一般来说:
+ k* o4 ?" {6 G8 \/ E# h1 M2 Ftar.bz2>tar.gz>zip>tar  t8 q- V9 _0 f; w; c" D
压缩率越高,压缩以及解压的时间也就越长。4 T' A) u' R5 |( ~
总结8 }# [, J- d* X0 P5 d

7 ^; ]' B1 k- s9 r6 P对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
' q* z% q4 D3 }' Y有任何补充或建议,欢迎留言^_^。
- F' O, D: {" O' z$ O" |' B- O5 o# C3 R" T) \+ {5 Z7 [8 Q

% A( ]8 I$ R4 ]" L0 m$ W+ r) F( a$ W: A2 v2 r3 c

: H. w" }+ l2 [0 o

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 19:56 , Processed in 0.065095 second(s), 32 queries , Redis On.

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