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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
% s. g# _# P4 ]% [
% x0 e+ X0 [5 ~+ [" F

6 T! v- p. P( g* r9 D. g# `$ n前言
+ W" ^! d5 J/ L7 }4 U4 R& J4 y( I7 Q9 D, v! C7 M
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
+ B2 @2 U# Z+ \8 o7 u+ J6 s# Ztar; v; g( t8 ?& q/ m) ~  E" c7 {

& {) A1 S2 `. ltar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
% H. M) k- I; f! K  a0 S涉及参数说明:

/ }; m* b/ y; p( Q" }, m6 E' W-c 建立新的压缩文件
+ i5 e' v$ Y" I, B/ {6 R# e-r 添加文件到已经压缩的文件
/ n# x' k9 O: T  T2 r! y- m4 E* M1 t-u 添加改变了和现有的文件到已经存在的压缩文件, a8 g3 ?% ]6 ~, h
-x 从压缩的文件中提取文件
3 |. g% Z! l: \* V-t 显示压缩文件的内容
- c6 X( p7 b- D' t7 N: m( ~% L-z 支持gzip解压文件4 g. g1 w2 e+ F* t, z) Z
-j 支持bzip2解压文件
9 v5 t+ K2 G( z) U; i5 q) e# }-v 显示操作过程
: G( O. k  s0 I% p  R# M3 K( s2 H-k 保留源有文件不覆盖2 Q% x' {5 n; D7 B
-C 切换到指定目录
7 e0 W: M4 y, @& b% v2 f+ l-f 指定压缩文件
# o& P% p6 A) `. [8 G; U
! H8 g  v$ V8 U, x6 O/ i" F* w--delete            删除包中文件
  z+ C1 }1 @  E8 n3 |+ p7 W--strip-components  去除目录
- ^; ], T( Q3 g0 [+ e--add-file          向包中添加文件
# ~* r2 _2 a0 I2 Q2 g压缩: ?$ \% u( c7 t  v; O# R- W, W

8 D% M: ^4 A( I! P# z: o3 f归档tar包,不压缩
( @& e- n4 \6 W9 l* [1 {# r% `
. N1 P8 F+ {# d1 C) n1 gtar -cvf test.tar test1.log test2.log #归档多个文件2 |# b. M8 J  C' F" ?
tar -cvf test.tar test/*  #归档test目录下所有文件9 o2 z) K0 r+ s5 ^* a
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 ; q- W6 M/ c! L. k( n+ w, P
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。& J9 |! \4 W0 j: K# |9 R: \/ f
归档并压缩为tar.gz或tar.bz2
4 P  [' g) Y5 d: H2 J( w$ [+ K( W7 R) R4 X# c
这种方式打包对文件进行了压缩:# Q* M. C% H$ a4 a' F* B$ E
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
- x3 D6 h9 F/ ^' Ytar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
" C& [9 Z0 [* f/ J7 b7 S; z查看压缩包中的文件
, |5 F: H( \  t  n; W+ c- y+ Q$ s% e4 D+ v% V6 K8 v  c
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:! z' n% e$ T1 d+ u3 a1 j& y
tar -tvf test.tar #可查看test包中有哪些文件" W; p' ~. G) _7 x" \/ f9 Z
打包后删除源文件: D) j# I1 h7 d# r) R9 z6 Z; @, d" ~

* a7 Z4 H$ s. ]4 }7 @, f- |有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
- t7 B5 u% w* q7 r$ @! rtar -zcvf test.tar.gz test.log --remove-files 4 o  B, s: P; f# y
打包除指定目录或文件以外的文件
6 W4 z  c0 ]- p5 ]+ i2 }! R
( k6 v3 A8 a. Y$ X' a对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:8 {0 E+ ~) w" E
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
% Z7 r: X, F( M! c2 ?% a& ^这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
- {+ |7 ^% a8 J+ E8 S向压缩包中更新文件
4 x* X$ f+ q1 ]1 a( s: H" B, ^, t5 o$ ]* s2 s% V9 C
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
3 d5 G5 i3 v+ Q7 y/ e1 ~- dtar -tf test.tar --add-file=test #只针对tar包+ k5 u2 u4 d# D; E! Q
向tar包中增加文件' M7 i' }# J  D
+ J! o8 A. n$ u9 q0 o3 A- `% T0 C# b
向tar包中增加文件可使用-r参数:
, M) p! a. d9 [  t9 D6 S2 w' Ytar -rf test.tar testfile #在test.tar包中增加文件,只针对tar' \" I( J) F: \' I7 ?
删除压缩包中的文件# |$ q7 P1 D5 ?  @' R' M7 [+ Q7 g

& e7 u$ z7 _% |  l5 Z2 E* h在不解压的情况下,可使用--delete选项删除包中的文件:1 I: T  T# n: O# Z. p. M$ h
tar --delete -f test.tar  test1 #从test.tar中删除test1文件* ]; f8 F* `' |0 N# H
解压
4 l$ |1 Y( \! X3 u. x! M+ b
/ ~( B( R+ I' E8 V( z& d' g% y解压tar.gz和tar包到当前目录' B5 v, u: G+ C, E" h

6 E( ?, `0 ]6 v, N2 btar -xvf test.tar.gz$ e$ A4 ?1 B/ _/ P% j9 J+ h9 K
tar -xvf test.tar
( N% C. }' O# p5 z5 Y9 \4 X解压到指定目录
" I& O7 R/ p6 H% ~* A4 ?6 U+ i6 }
; K) v* N1 L5 o9 t$ u3 x; b4 _: ktar -xvf test.tar.gz -C dir5 X9 {. e& }' N0 `2 A( B: b
tar -xvf test.tar -C dir; t8 E. A, J4 G9 E
解压包中指定的文件
7 m( {4 r4 F# m7 G
  B4 t% b! W& _& Q6 R  _例如test.tar.gz包中文件情况如下:
3 W4 x2 D+ s. ~, J9 {) ], j4 K/ m1.txt3 ?% ]/ Y3 Q6 j0 f) V  G% J4 E
log/' B/ f% ?. s! B) ]3 H
log/1.log) C3 N- z& L2 q- W0 _4 S) h
log/2.log1 Y, M, M( S& {9 i
log/2.log
) a0 }$ m1 C5 H- h1 T! O( x, Y8 olog/4.log
+ \& O' f9 c5 j8 z$ q9 slog/5.log
" d" ^. P( g+ Z8 m如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:( K& p$ l" U5 v1 `" q
tar -xvf test.tar.gz log/1.log
8 }" i1 G5 |% o' ~2 q+ Q7 Qtar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
0 f; `% J: |) W7 m6 k解压时去掉目录结构
! s3 |& M( i& C0 X& |# o) b8 m+ h- T( {* ?8 i* m2 \) m; j2 l# n( C4 {9 ]
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):& K0 w% ]2 I+ X$ h2 }7 ^7 B6 R+ H
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录) X) s1 g# y3 y7 M5 h
解压时不覆盖原文件+ Z( J3 A& S" y/ J* ^9 f; z
+ _6 f  f0 w1 \8 q" w5 V3 K
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
& S4 `  k7 t& A- P5 {tar -xvkf test.tar.gz  ]0 {6 c" z$ e9 F
特别提醒" F0 J. b5 W& x& M) _* j0 q& X

* p' O/ @- q  K( X9 ]8 X前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。; k, ]& y$ P* ~3 C& x# g
zip/unzip
3 H* V) p4 t) A/ g0 u: l- {* Y) x' e/ g; _
zip和unzip命令主要用于处理zip包。
9 x; \2 t- U: G+ i" I压缩! m1 V4 s9 j5 V& C

( U: y6 n5 j, ^  |涉及参数说明:
* \5 M3 d% {" Z* r-d 从压缩文件内删除指定的文件。
- B5 n, X5 x2 K) T0 \-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。. ~* f/ U7 U: y' n( c- z! p
-j 只保存文件名称及其内容,而不存放任何目录名称。4 T2 K1 n( D& e2 c( n4 H1 _
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
1 s5 X8 V# J; D/ V% k4 v3 B-u 更换较新的文件到压缩文件内。
' h6 V# {9 k7 v( h-v 显示指令执行过程或显示版本信息。6 @8 v5 u! o* L9 s
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
4 P' |  s; A5 ^6 Q+ k- <压缩效率> 压缩效率是一个介于1-9的数值。
8 I: l+ m' {& \6 N7 P7 {压缩文件+ k( G/ {) a$ b1 |6 M
' T# z" d# L  N; B4 V9 A( u1 W
zip -r test.zip test/ #打包test目录下的文件
8 I7 h' ]: G) Gzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
# V3 M+ t( m& R* H/ @, C指定压缩率打包文件! d0 B% K/ x/ {4 v
- I5 K- b. U. m7 P2 }/ O* f
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长. r" k5 n# P5 P8 b% m* b2 b9 d
打包符号链接文件
+ l6 s2 z+ j* {; R( ^
# O$ \4 o9 G9 Q" w* ^前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:$ x. C1 s$ Q% }4 `: X
zip  -ry test.zip test
% U' l! p8 b% j! p向压缩包中增加或更新文件
4 g5 p9 H. ^; i; D: Y/ Z
' v, Y$ h. D! z0 n* m有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:3 R* ]3 `6 B& P/ C5 _2 k7 z
zip -u test.zip test2 #向test.zip 包中增加test2文件
# \$ |2 A/ ?4 ^1 d7 Z压缩时加密4 _2 {: @# ?+ m3 g% n$ Q

" ]/ `& k& M0 @压缩时如果需要对压缩包进行加密,可使用-P参数:
, b" Z) D5 g$ I7 O( `- H5 Lzip -r test.zip test1 test -P 66666 #使用密码66666加密: m/ _1 C( p3 R7 h
删除压缩包的特定文件% U! t. A  _3 \* o' R7 g
6 E( K7 F6 T7 t6 V1 p
zip -d test.zip test  #删除test.zip包中的test文件
9 c% \9 d3 ?2 ~解压% D, |2 I5 d8 u  W
- p" n3 b* [+ ]4 A$ g/ u9 h/ Z: k
涉及参数说明:
5 o/ V# a+ A6 {  l! |; F-l 显示压缩文件内所包含的文件
9 w* H' Q( B0 J-j 只保存文件名称及其内容,而不存放任何目录名称。+ E) M. Y% E. R9 Q2 A6 E- a
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该, N0 _! D! x0 U( e1 T% p! W
-v 显示指令执行过程或显示版本信息。  j0 v- P3 O+ Q' z5 L2 a7 n
-d 指定解压目录,目录不存在会创建
, ^4 q  Q4 e  }. ~" k! t$ K查看压缩包中的文件信息0 @5 W9 F# P0 Y0 d

% |' X- A4 Y- o# W. J* |' kunzip -l test.zip #可以看到压缩包中的文件名,日期等信息# y3 a  V( ]& w& B' U
unzip -v test.zip #查看更多信息,例如crc校验信息等
5 H' \$ q/ S  s; V& D2 y( B  l/ C解压压缩包3 S/ j8 @/ s2 }2 D4 D( }4 w
( e. z% k8 p2 h. R0 v
unzip -o test.zip -d dir #讲test.zip解压到dir目录6 H% I" V* U) F0 w
解压包中指定的文件
; M8 L. D6 }& }7 s6 F/ U# i6 f9 w- N
) T/ Q4 U* a; o* k如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
" }, j0 c" x: b% tunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
& m! b& I8 r, `- t% ?unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件, e2 @; w; `( z0 I
解压时去掉目录结构
" O' S. F# S  u. s  G$ b+ f5 H! I" X; Z# T
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:( ?( q. l% h7 N: r2 U" a
zip -oj test.zip -d ./temp  
* W1 v5 S* p3 t, [3 N9 y解压jar包
  @2 [% z7 f( a' b8 k& u+ A+ F: O! u* X! l) o# K! @
jar包是java归档包,但同样可用unzip解压查看里面的文件:
2 J' e) K+ ^% l% R' cunzip -o java.jar -d dir
  S" t4 F5 y2 c3 v/ _/ Rgzip! l& c' y' Y* `: D
) [; ]6 B  T3 _
涉及参数说明:, v# n' M# |% {) G+ D3 y# ^
-k 保留源文件8 C) y  Z  G2 |+ G. O* ?
-d 解开压缩文件3 z; l1 e; C: z) f, y
-r 递归处理,将指定目录下的所有文件及子目录一并处理8 U# x  Z8 G" Q& z
-v 显示指令执行过程
; V+ C9 S8 T5 @! o4 w- g& |tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
/ G1 n7 S4 Y% w4 L* y2 v; ]gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包' r2 l/ W4 x0 v  R4 N2 C( S  o
gzip -rkv ./* 递归压缩
5 W/ R: D9 s9 O4 c! K3 K解压也很简单:
6 ~; I3 P- m7 D, l. cgzip -dv test.gz
+ F0 X  J1 w& [* k; Gbzip22 X7 L- j) d& a- c. Y3 s- J

4 ]+ V* N8 F  p. U) ytar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
& @  B! N+ y3 y1 U3 y6 Z5 q; P: X7 obzip2 -zk test  #压缩test文件
; m0 ?: f' h4 X7 X% ~bzip2 -dk test.bz2  #解压7 T$ W5 W( G  D: I, s/ u9 c  M9 l
rar/unrar1 N% j6 O0 F5 K6 f, E1 M
) ~7 F! o/ ~3 X* t5 Q
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:6 j3 b8 _6 \+ Z/ H& Y2 e# ?$ N
rar a test.tar test  #将test文件压缩为test.tar
$ W( r9 _3 t% Z4 k. C1 C  K5 b& ]& l: Z% \rar e test.rar       #解压test.tar
* r2 Q+ k2 B& Y2 ^& ]unrar x test.rar     #解压test.tar
# M8 j  E! Q- b$ B1 _5 h* W# X压缩率比较. C0 e$ z2 M/ ^# q
: `* B+ r0 k3 O# q
压缩率一般来说:0 m" C/ {# S$ }: O
tar.bz2>tar.gz>zip>tar
9 u+ z, Z) X4 q压缩率越高,压缩以及解压的时间也就越长。
; o: l6 N6 D4 l2 P总结3 `# V* I* H6 x' u$ v5 g  T8 i
! L7 o4 k+ m2 s. b, t9 E
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。  R/ X, s* T' Y! I
有任何补充或建议,欢迎留言^_^。
0 q( c. p- i5 R4 A1 s( Y; Q/ ~/ ^; K8 ~: Q

: q" [2 h9 T7 J$ r! p: Y$ {! a
9 s" E5 N* O1 ]) M1 k. e
/ A& \1 D- b% K- Q# f& W

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 13:54 , Processed in 0.055427 second(s), 33 queries , Redis On.

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