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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

2 w( b( R6 z% @" j  {3 o7 T. Q0 c" [- A- ]# F5 {
8 C; N8 @/ `1 T; ], w
前言9 G9 Q/ T5 _/ |0 @& E

# U! v3 g7 l& |% VLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。  v/ S0 n, s1 f0 k
tar( f( u- U8 @$ v$ K
4 |+ ?; h/ k- u( j. j0 r! D' R
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。- B1 F! \2 g) Q( S7 o' a
涉及参数说明:
1 C7 M2 s, y1 Q) k
-c 建立新的压缩文件
0 X% Q+ s4 X  U- G7 N" o2 l4 U-r 添加文件到已经压缩的文件
* N4 w& B! X$ \-u 添加改变了和现有的文件到已经存在的压缩文件
( i( Q* j5 E, z: Z% N: y-x 从压缩的文件中提取文件
7 k. d9 Q8 j8 c" H% n9 m-t 显示压缩文件的内容
% V( u3 b/ k- L5 X+ x$ H  H( N3 ^-z 支持gzip解压文件$ H0 n5 V) }6 E# s3 u: z
-j 支持bzip2解压文件
9 @  `7 W# t1 Q. n8 t6 w! W-v 显示操作过程
3 K' F$ n4 K* e) S-k 保留源有文件不覆盖/ B7 C3 S- Y4 q5 e% H' z8 e* P- `+ ]
-C 切换到指定目录
6 C! ^  o- `: ~# A  T* x2 \( A-f 指定压缩文件
; \8 b8 \# U7 d5 u4 X
6 f: e: v+ Q$ Y9 n" H. \--delete            删除包中文件
0 M8 p1 f' q: `! R# m, ]; O' U8 J--strip-components  去除目录$ [1 \5 w% S7 g3 c/ I; @( N
--add-file          向包中添加文件  U' Y6 H' ]% C0 i1 [
压缩
9 _/ J5 M! B+ p9 B
, v" A2 V6 K& L  u8 s归档tar包,不压缩1 G4 w1 ^7 F! s# A) d+ `9 ~
5 H( U9 b( A, f0 E
tar -cvf test.tar test1.log test2.log #归档多个文件
% E& [' v2 ?  U, O. b1 _" gtar -cvf test.tar test/*  #归档test目录下所有文件. D# L# Q* H' M  q- P! Q8 r! _. r: I
tar -cvf test.tar *.log  #归档所有以.log结尾的文件 + o% {* b$ L) c+ D1 s
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。; Z, `6 J2 E9 N/ c
归档并压缩为tar.gz或tar.bz2
8 g2 c# f! k" O9 k% {' J" c4 Q1 B0 x# T% T4 v: ?2 `9 Z
这种方式打包对文件进行了压缩:
; C8 `! E3 D+ `  ?) qtar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
' f. S' n$ t, f- q- }% x, Etar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
* {# \+ t/ {$ `0 I& ]- F/ J% C' i查看压缩包中的文件2 o* [4 G& D; `

) y) x% A" l( R" M8 j! L% r如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
5 S6 k* h+ _7 {tar -tvf test.tar #可查看test包中有哪些文件
5 @+ ~! H' f1 }) t打包后删除源文件
, f6 n" n! h6 [3 b6 }5 Z; c( Y7 Z- f
6 q$ t6 |! v3 l1 E有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
0 O2 r5 d  G! O9 G4 {tar -zcvf test.tar.gz test.log --remove-files
  z/ {- q* w% G3 w3 Q( H% r! @& q6 y6 i1 k打包除指定目录或文件以外的文件
) X8 J7 U0 ~- I0 O& n8 E% r* [' G7 y2 b) K  b. o: Y$ U% B
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
+ R% L' |8 Y( k* Y$ F* }+ v4 [2 ktar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件4 |0 E3 _: a9 V; C
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
! K. z, p( W% e+ n) m向压缩包中更新文件. R0 f" F- c; L7 w
) O1 Q* P* K6 ?0 x9 u
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:# }+ \; F1 D6 K2 x0 w: \
tar -tf test.tar --add-file=test #只针对tar包
8 q" I8 A1 C+ S- T# Y3 E向tar包中增加文件( p$ O; j6 v" T# {1 T) d
7 x+ A1 h! z/ ?) c0 N
向tar包中增加文件可使用-r参数:: s& J/ {4 r9 [
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar
9 X, J. u' [) K1 b9 Z- G删除压缩包中的文件
, O9 E# x. B% v. L. h0 S+ @1 |+ k9 \9 R) u, E+ U9 D* r
在不解压的情况下,可使用--delete选项删除包中的文件:1 `1 S  o/ Q; k% |, P. x0 F) g1 z
tar --delete -f test.tar  test1 #从test.tar中删除test1文件
4 o" U/ X+ B4 ^- I解压
! [. t1 h& ?& N! }2 r
+ \9 d% @- x6 c  Z8 y, y解压tar.gz和tar包到当前目录- T; K/ |& j# i- Y+ }* e/ O7 R) C. S
3 J4 F9 O; |1 ~7 A
tar -xvf test.tar.gz
2 d6 q, d8 N$ T2 P# m" K& r% Wtar -xvf test.tar / v& v- h: Z5 u1 B$ `
解压到指定目录: R$ h* R1 O! c7 z2 B! s3 c1 H

" R: Q- H) c/ D2 Wtar -xvf test.tar.gz -C dir7 P+ U% `# Z& e
tar -xvf test.tar -C dir' h, j! w* [0 s  V" U1 m; p; |7 G
解压包中指定的文件
3 W% Y8 N/ ^( t4 O3 g( G
$ W9 N% `( t3 x- R例如test.tar.gz包中文件情况如下:
4 R0 F" B. [" L6 j3 L9 w1.txt
! H8 N6 N* }0 U: k% u' ^& W8 ilog/
  Z" w1 M9 A4 y2 Z4 x: b& C3 blog/1.log7 \. P! n# c5 e: C; Q9 S! W( S
log/2.log
3 S! M3 B+ {# b! i9 }+ d$ ~5 |log/2.log8 t( k1 ?" G6 r- b
log/4.log
' m& d. b4 Y3 t4 |' e" M. {log/5.log
9 C, C2 n: _' W+ P& u' v& `如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
( ?2 u3 y% ]$ |* I& L$ H; K. Ytar -xvf test.tar.gz log/1.log
2 D7 n) F/ p" K, V$ F/ q4 M, ktar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
# O3 g; A. C6 z2 y( b, I解压时去掉目录结构
( A3 ^7 X8 ^4 n) q+ p
8 l& L" V* e& _. Z- R" {% U4 _1 b! R压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):( P0 V, g6 {1 |: C* p1 j
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录4 H" ]# |$ A1 U8 Q2 K3 {; c" ^
解压时不覆盖原文件
2 ]* T' E; ~0 [5 }  |' }& ]
" `0 @' g! h" x# ~, T; F当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):
3 X2 i8 x1 l$ B6 j" Qtar -xvkf test.tar.gz
: d1 t( p* \% \8 j- T特别提醒
# t8 M5 d" u9 g$ |2 R
2 _1 j3 c( v7 M' p前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
' o+ T* _6 a% _  l/ N5 r9 Dzip/unzip
$ c) k5 _1 M* w8 w, Y) ^/ R; y
* Z' Q8 n7 h) b. m) k9 @zip和unzip命令主要用于处理zip包。$ A1 n% K, w" u+ @4 M0 U
压缩
+ _# N2 B3 w  O, Q4 ]. Q1 ?: X% L- Z! b* q
涉及参数说明:
! o: G! E5 m8 E8 P9 a-d 从压缩文件内删除指定的文件。
) P5 b( j9 K' E2 e! L0 ?2 D  f-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
. ?* a2 R/ _8 {+ E-j 只保存文件名称及其内容,而不存放任何目录名称。
1 Z: v# H9 f* a$ S  e-r 递归处理,将指定目录下的所有文件和子目录一并处理。
9 Q. @0 |" Q/ O& [% q3 ^  y2 K-u 更换较新的文件到压缩文件内。
5 p/ X( y$ T- _-v 显示指令执行过程或显示版本信息。
8 M4 O; L- |( ?5 X- X6 d-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。, U0 d7 y. j4 X# i0 h$ x- ^
- <压缩效率> 压缩效率是一个介于1-9的数值。
" K9 ?9 I) Z) J! `: V9 G压缩文件
: m  f5 b1 @% p0 e% }4 q" b0 K4 }( d1 ^, S. x
zip -r test.zip test/ #打包test目录下的文件
. n% X, X8 |4 O- b6 T- t, Hzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录( i7 y) f: I" B! G/ R  k/ g
指定压缩率打包文件) _- W) x7 @' f! Y9 K, f$ q# o
+ u+ k- p1 n! t5 ?  ?
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长: A6 E9 w8 a* Z+ l! A
打包符号链接文件
5 u8 I. _$ ]* n* w. M; @+ A. Z" h2 k6 z% Z& S/ _+ A( A
前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
- ?% \: x7 |6 s( p5 lzip  -ry test.zip test! }) [, a: u7 ]: g* V: O
向压缩包中增加或更新文件3 I  |) C: P  U1 S9 v9 Z. B; Q

( h. i3 h5 M1 i1 e, a有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:" x. O0 ^- {& k. w* y# |
zip -u test.zip test2 #向test.zip 包中增加test2文件0 E9 g6 U7 m0 X3 Q
压缩时加密
9 H, T- x1 J# _  E* ~, x7 e! Z
1 x; {6 a4 m: ?2 f- I压缩时如果需要对压缩包进行加密,可使用-P参数:. _- [; Q; G" D4 }* d
zip -r test.zip test1 test -P 66666 #使用密码66666加密  @+ q0 _7 C& `& |; O' Q% z
删除压缩包的特定文件
- F* R9 w1 `/ M, S
7 g7 U0 b2 s+ c2 \* A) a$ kzip -d test.zip test  #删除test.zip包中的test文件
+ h5 T2 e4 `' M' k/ b解压
  R* M* H) U& q; e- _% r8 `1 n- ]/ s0 @/ z/ W( \
涉及参数说明:
( P' p4 ?5 P; L- v, [5 y  V! `-l 显示压缩文件内所包含的文件
  f1 b6 l. l* n1 e-j 只保存文件名称及其内容,而不存放任何目录名称。
. J& S8 ~- n+ b! L  G-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该7 |! G# \9 C  v1 i" w: k2 g9 T4 f
-v 显示指令执行过程或显示版本信息。
" B/ x1 S& V% _, d& c. M, U, h-d 指定解压目录,目录不存在会创建" m( |6 K! j! v1 j4 t
查看压缩包中的文件信息
3 W8 }0 R/ d' Z. t- L/ _6 M- L. h( q, a$ i
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
2 u1 Q" Q& S) T+ punzip -v test.zip #查看更多信息,例如crc校验信息等& S) g7 h  l) a" n- F
解压压缩包9 }" C  S: B2 p7 d% f( q& [
9 a' C0 j5 D& C& y1 B* |
unzip -o test.zip -d dir #讲test.zip解压到dir目录
+ b/ u) {8 q, t. p5 M! d! P解压包中指定的文件" M# S% K+ L  N3 k) B

! B% Q- D8 s8 F" F; h' k如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
9 {. D$ I# ]" B) F2 Ounzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
# ~. m4 c& T# X. g$ ~+ ^4 nunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
( Y& z" p" M2 u% l! s% U4 r8 F( H解压时去掉目录结构
. {6 r) p' r' `* J5 A0 s9 [4 y$ k% d7 h
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:! U* Z  Z" [7 Y# m' R, d
zip -oj test.zip -d ./temp  
* v9 F, c5 ?+ h7 b9 z解压jar包
4 I# V$ B1 c  ]$ ]9 d" {' Y
9 j9 |: D! A* \- C1 T) ?# b7 Ijar包是java归档包,但同样可用unzip解压查看里面的文件:8 I1 ^% n5 Q( G3 w  F7 G: d
unzip -o java.jar -d dir0 q  _/ X  q# a+ A5 M
gzip) ~6 M2 @* a$ h; m8 _# Z' O# ]
& m8 J7 ~  P- o
涉及参数说明:
+ ^. Z% o6 j1 W# e-k 保留源文件: T3 u5 C4 i2 A% r7 B
-d 解开压缩文件! d" T. X6 Y, G3 T+ z
-r 递归处理,将指定目录下的所有文件及子目录一并处理
2 y: K. ^. J, e-v 显示指令执行过程& X3 \/ _% D8 b4 e1 M  J) X
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:0 G& s- z, L* n2 j2 V6 O# a7 c8 {
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包+ N1 c* p0 G5 I9 w
gzip -rkv ./* 递归压缩0 l/ B: Z+ C. c7 |; x
解压也很简单:
' A: \+ ]0 F8 z2 o5 mgzip -dv test.gz 5 H' {7 J/ D' u* P2 p9 T; P
bzip2" G& |9 D) g- |
6 A. T8 S* T, I8 I
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
8 U/ U4 D! A, {! ~bzip2 -zk test  #压缩test文件
: @1 ?' v' {. \4 R; b3 M7 J& Kbzip2 -dk test.bz2  #解压
* P$ k3 f7 s+ y" p4 F; Crar/unrar# o) V' {/ i5 Z

: J7 z$ R1 n' j2 e$ p6 U8 Lrar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:8 Y" o/ [6 ?5 ]  P' x7 k
rar a test.tar test  #将test文件压缩为test.tar2 n: \; c/ J9 i7 {- l
rar e test.rar       #解压test.tar& ?9 [6 Z/ v  |4 s3 x) b
unrar x test.rar     #解压test.tar  w  |3 ?( R8 x, R$ U, j" i
压缩率比较, F$ S$ Q/ N# w, H

# `( V' N4 y' n% ]压缩率一般来说:
# r$ A) {' Y% T- Ztar.bz2>tar.gz>zip>tar* c: F, k7 E2 |" O! e" ?
压缩率越高,压缩以及解压的时间也就越长。1 {) [0 g+ W, }% N# ?$ o
总结
$ _4 z8 V$ Z! W6 i( @8 y7 H2 D* I* p$ b
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。4 ^. v" \+ s' {3 Q3 m
有任何补充或建议,欢迎留言^_^。
) L9 ^* l. ]; @( [4 V8 T( O
. `# |9 T, A8 ?+ ~4 e( ?  o9 H- _& @/ ~" M  ^
* C' s" J3 c2 L% g
, c, c3 Q. d% A5 b1 p" X, E7 _

微信扫一扫,分享更方便

回复

使用道具 举报

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

本版积分规则

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

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

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