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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
. R- l' m9 v  c. E: U3 {
4 `. P5 t1 I4 \1 {- h
% [# Z9 L+ r" m; ^# t& V+ Y% R5 I$ q3 Q
前言5 k6 z" A9 X- J# F& J+ g

! T( b# |+ R. `& b& C4 FLinux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。$ e/ O2 X3 B  T3 M* Z
tar6 _4 V# O( L6 @7 C, `" c9 g
& h; I7 `3 ^7 L- A) N8 e7 ^" Z4 U
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。6 w0 ^- F& ?* y. f
涉及参数说明:
* ~: J0 z+ z5 _- O# }# d
-c 建立新的压缩文件
1 R8 ^3 p# H5 T* k1 W: S+ I-r 添加文件到已经压缩的文件
6 s( z* l& A! C4 E! r-u 添加改变了和现有的文件到已经存在的压缩文件
; }! V! p% h8 b$ T( H6 ?7 F-x 从压缩的文件中提取文件% l2 w! m, P& B6 d1 I
-t 显示压缩文件的内容
/ B) e. v9 k2 s9 [-z 支持gzip解压文件
  H$ l5 {/ D3 r. f. o1 w% @-j 支持bzip2解压文件
0 V% o% y, f6 |( D-v 显示操作过程
0 T" h8 d+ F$ Y$ j4 @-k 保留源有文件不覆盖
  B5 T  U0 r4 a* ~) Q4 h-C 切换到指定目录
  E; _- @3 }2 d  n5 p9 ^4 [5 h-f 指定压缩文件
7 i  [. v; D: \4 R2 I; p+ ?+ p$ Q" E3 V
--delete            删除包中文件
# l$ f* m' K: i8 n0 }! j7 ]--strip-components  去除目录
5 V# z- h/ w4 Q--add-file          向包中添加文件
& x2 x* |$ i$ ?: Z0 W8 |. ~  k  N压缩
; a2 k; c5 p3 i6 b5 M6 r, D
$ f3 o' h/ L; d1 G+ [5 Z归档tar包,不压缩
6 i3 l9 c$ r5 g! u' d0 o" X4 j1 [- c3 I) k! D5 N! H1 a: K+ E
tar -cvf test.tar test1.log test2.log #归档多个文件
# m8 k* j3 u8 e) s- n: q3 V2 Vtar -cvf test.tar test/*  #归档test目录下所有文件
, Q' \. [0 v* C* g' o* n3 etar -cvf test.tar *.log  #归档所有以.log结尾的文件 $ ~% S9 k, ^' J
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
7 H5 C: m& ~: u8 z1 g# ~5 y归档并压缩为tar.gz或tar.bz2# n+ x' y1 c1 H0 Y  q7 }& I  ^3 j
3 _* Y- x2 B  {2 V' g
这种方式打包对文件进行了压缩:1 a/ a. s# X* t" ~# x% I
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
! D- v/ c7 s# F5 f! A/ ?2 etar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
  F9 @, k$ l5 Y& {1 f7 z! O' m. f+ ^" W查看压缩包中的文件" O" {$ ]' i  I2 @3 M
3 C3 F  I9 o8 O4 R( N
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
; \4 C4 K: F- c4 ttar -tvf test.tar #可查看test包中有哪些文件
  Y- W% ^4 A$ I打包后删除源文件
+ {2 I/ ]: x2 k2 |3 W5 i$ e/ [& [- W; p2 R
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:. F+ F2 f- X8 Z5 t2 U0 G& E
tar -zcvf test.tar.gz test.log --remove-files , |! w' M2 @4 c9 \7 {3 k
打包除指定目录或文件以外的文件- }! K+ X9 {) h2 Z) z: R: F
2 }6 J! s! C* _8 v9 |) u5 U# E# g
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
: T0 N2 @! W1 E# W! i2 O" H' g* Rtar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件) n" t2 s% C+ ~
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
6 N1 l: Z% t2 ]/ E& t向压缩包中更新文件' i' n7 `% F# R  ~/ W2 J  P. z
) }2 K) z0 B/ `8 u5 [! G, s
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
5 S- p6 ]" o: s; Ytar -tf test.tar --add-file=test #只针对tar包
- k" _  U; y! R6 w% T向tar包中增加文件
9 |- R" A* R4 k* b) D9 b% R5 k& o% r4 X
向tar包中增加文件可使用-r参数:; E3 d" U  h( h4 S2 v$ S* j
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar; P1 \5 D' Y5 F; K4 Y6 y
删除压缩包中的文件
6 t+ }# x0 c2 u1 e9 z* J
  H* \, F9 J% l5 @) _( `- i0 j在不解压的情况下,可使用--delete选项删除包中的文件:4 [4 ?6 j* d4 a& l+ g. w8 R
tar --delete -f test.tar  test1 #从test.tar中删除test1文件# |# G5 m/ _% a; U9 e% @
解压
* ~7 i! |/ \3 E0 [$ o' j2 h* [, E5 S
解压tar.gz和tar包到当前目录
% e6 p5 _( d/ R9 s. I* H3 w) ]1 m) `1 x, W3 h, [
tar -xvf test.tar.gz$ l3 t+ Y: v; o) Y7 ]7 d8 ]
tar -xvf test.tar
+ J* |3 N, ?: X2 S# f; z解压到指定目录
  S) _6 i/ ?) s1 v$ V* a) h; h8 f% c: b1 X2 r" H4 i' j# \
tar -xvf test.tar.gz -C dir3 h. `5 J3 l1 l9 w6 X
tar -xvf test.tar -C dir
! h( O, C2 L; f! w2 K5 ^) G# k解压包中指定的文件
/ Z- b  |/ M0 \9 V' y
& j1 Z( Z% A7 q2 }例如test.tar.gz包中文件情况如下:5 N* v/ s' l3 v$ c$ c
1.txt& f  _' b6 p4 s/ F* H0 w
log/: L+ o+ y/ U3 N4 X" V6 @1 ?1 N$ ~
log/1.log
9 o8 c' J4 x0 _4 h$ d0 U" P# Flog/2.log6 S/ A+ c9 m# d4 B3 W1 N% \- S: n
log/2.log* A1 U: y# i; p& ~$ @* u6 k8 C
log/4.log" Q3 t0 t) |* W
log/5.log
9 c3 K1 n  F6 A" h: k: v如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
- t0 w3 D! h; p" I: Z% vtar -xvf test.tar.gz log/1.log
/ _! }1 ?' ?, Ytar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录& [3 @4 ~! `$ P) q
解压时去掉目录结构9 G: k. ?. p2 C  d0 I3 \1 H

0 T! c' N# S3 c& H压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
4 ~! m2 \' C: [" |. A) Qtar -xvf test.tar.gz --strip-components=1 #去掉一层目录
0 g& Z1 Q! Z7 Y  I& o1 j解压时不覆盖原文件
7 {7 w; h; h; R4 ^; ?6 A$ o
+ p$ v7 g* {% {; a7 ~9 k当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):# P1 x7 a, U, l" {7 c
tar -xvkf test.tar.gz
1 L! R( P0 z6 w/ ^, E特别提醒
  e: r  U5 B/ Z- d8 H* ~8 |9 g$ O" j. i5 R1 f6 n. m8 v! h
前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。& d0 v. ?8 a& o* f
zip/unzip
) _& M# ^- f+ C+ i# \
, y6 S( K$ b  j# Vzip和unzip命令主要用于处理zip包。9 X" C' |" _$ K6 p" E! b
压缩
" Z. S) }( K) E: i+ G! Y. Y  ~, p" r: Z2 p  N% i, U. c) h0 Y
涉及参数说明:, a# Q; Z) b3 [) T9 l
-d 从压缩文件内删除指定的文件。
  E  ^, j- D! X6 \& M-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。; p9 E5 P, O6 ?( d* N
-j 只保存文件名称及其内容,而不存放任何目录名称。7 A6 Z  X" c8 z- V  O3 C
-r 递归处理,将指定目录下的所有文件和子目录一并处理。+ K, e, E' w# D) a
-u 更换较新的文件到压缩文件内。  O& d- [" N, b5 |2 _
-v 显示指令执行过程或显示版本信息。
+ O; D& C. o' Z5 o-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。, c, t6 g3 s2 t. o
- <压缩效率> 压缩效率是一个介于1-9的数值。
" R! P- Z/ P5 c" `压缩文件
0 D5 Y( P# d# |2 l2 E- t6 F6 s* @6 }6 b" d* K7 ~
zip -r test.zip test/ #打包test目录下的文件+ [8 Q% b: B  M, L) s
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录0 a0 Q  m, C1 s) X9 L5 m: t/ X
指定压缩率打包文件; d1 t) Y+ P" c. m" l3 f2 t- W

$ [* O2 `6 k7 v: P& G) z% X' Ozip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长5 B! S3 t" I, e3 l
打包符号链接文件
( K3 j6 ]$ K/ u1 y6 n3 q; {) ~0 u/ x
- w$ N; f5 x* E, o: j( c" M" C前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:  F; ?" b$ x" J7 ^! s
zip  -ry test.zip test& l) M1 {% G0 W( u
向压缩包中增加或更新文件
# y0 e- i4 B/ a% P/ @% r  o3 E
. N, H! X+ N. B$ O3 p有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
0 p/ d- F: m3 M7 F0 `5 D7 x) H/ y( r, dzip -u test.zip test2 #向test.zip 包中增加test2文件
# S. N" R7 m' o9 Y8 y: Y  c8 e. `压缩时加密" M3 U. r2 ]! ~% T

- a8 {" b/ c3 r$ i3 ]5 {" H压缩时如果需要对压缩包进行加密,可使用-P参数:
/ l1 x* o- M/ |+ O6 e: ]zip -r test.zip test1 test -P 66666 #使用密码66666加密
* \/ y+ A. E/ a删除压缩包的特定文件
, u" `8 w  R7 A! P9 x, r  N8 k. s. |3 J1 H
zip -d test.zip test  #删除test.zip包中的test文件
9 V0 ?# {  k  Z& q, q解压4 I4 \7 n4 C6 |! r: `# f
7 b( ]/ j$ U0 w( _, H- R% E
涉及参数说明:
0 p' f# Q  J! ]7 M5 u" w/ P-l 显示压缩文件内所包含的文件& B5 A7 x* `4 ^+ G
-j 只保存文件名称及其内容,而不存放任何目录名称。
' {0 C+ N  i7 j: T8 V* B. {; B-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
1 X+ n0 m7 A1 f; |2 O3 [-v 显示指令执行过程或显示版本信息。
' c. x$ s. a. i. i1 R/ a* Y7 j! `-d 指定解压目录,目录不存在会创建
* i' K; `$ ^9 c查看压缩包中的文件信息3 Z2 z/ L8 @1 f1 K4 ]" Z7 l

1 _5 D0 s, s' {unzip -l test.zip #可以看到压缩包中的文件名,日期等信息* ^; D+ @$ e" N6 ^5 g, U- `
unzip -v test.zip #查看更多信息,例如crc校验信息等
% X/ @; u9 z% }" P7 k8 ^) ]解压压缩包' ~8 [& n+ ?: f, }- l* F' u
- a' W2 W5 @( C4 ~0 w% k; X: {
unzip -o test.zip -d dir #讲test.zip解压到dir目录
# m7 O; ~8 X0 N& G+ N5 p解压包中指定的文件' Z/ l! Y' ?, W( L$ W
( ?6 W# Q7 n' X0 ~# a
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:6 _, W0 e; D4 }+ B) l1 Y$ Q( A7 |
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录* Y% X- P) H3 j8 I1 `
unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件# k4 v* k2 [. ~( B
解压时去掉目录结构' ^* F3 s, L) L/ Q
- ?& Y! ?0 m" p1 o* z
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
% h& h3 `: }! [8 m+ Azip -oj test.zip -d ./temp  
4 O) O* z2 q1 s/ c) V1 n6 f3 b解压jar包
- f2 U& f4 y. W" o% O
8 ~9 W: i6 S! C# ]5 Qjar包是java归档包,但同样可用unzip解压查看里面的文件:
2 l, @+ o& a! S0 o( M; K: Punzip -o java.jar -d dir9 N0 D% N5 C: D6 v" ]2 X) ]) `
gzip
" S% L- M% v4 j) f; o" j# a% s; c, S2 d( T
涉及参数说明:
. f: u% e# T  h6 |8 a  D-k 保留源文件
% a( z: M4 H* g5 x9 Q0 F& d) ]. y5 A-d 解开压缩文件- x, L+ K& c- k
-r 递归处理,将指定目录下的所有文件及子目录一并处理
( W6 d1 J* ?1 N1 k/ s1 _( @; Z-v 显示指令执行过程
8 L* Y: @" |  y! i2 R" d* Htar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
( }2 z' U8 {& L9 Y: d; v7 Igzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
2 i4 z& I4 H% S/ O) h; _- p& c  W' T1 ggzip -rkv ./* 递归压缩8 i* L2 \- J% V
解压也很简单:" q7 D! l- ^. V1 b/ [& M9 W; Y
gzip -dv test.gz 5 C; b6 A: @( t$ V
bzip2) w9 Y  h& S) g+ I' U/ R

4 f2 ?$ J$ c5 E# h' p& [! e2 _; Star命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:+ z/ i  y4 i5 B% I& a5 X! Y
bzip2 -zk test  #压缩test文件9 |1 T+ Q" j2 L& s, u0 l0 b
bzip2 -dk test.bz2  #解压" g$ G: t+ T, K9 u0 w7 w4 J
rar/unrar7 Z& R6 o: G# O
) z- K. D3 u0 k# J+ R5 u
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:- S2 W6 J  y1 |4 M% k
rar a test.tar test  #将test文件压缩为test.tar
$ _( F* M1 q9 H" a& }7 Brar e test.rar       #解压test.tar3 C. A2 t5 ?* i) w/ u+ r9 r6 k' V
unrar x test.rar     #解压test.tar6 u3 Q- O1 j/ X8 v
压缩率比较4 E+ v8 h. {4 L' q9 D: a' ?2 R, K

0 o* L2 `% Z! F7 m# C压缩率一般来说:
3 p# p+ @8 s+ P9 ?4 U7 Q. t' Utar.bz2>tar.gz>zip>tar
% i3 j) n8 _1 V7 \+ d压缩率越高,压缩以及解压的时间也就越长。
( H( w8 N6 H: g6 V# j& r总结" }" b% {# v; b8 e% ]/ P" ~
0 D2 r/ u- i. p9 D* E8 ^
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
" A# ]! t/ N+ t* @有任何补充或建议,欢迎留言^_^。
+ V! v  r8 S3 ]% K- y/ N) P" {5 X& I' A& \

* O- h1 [' K) r( m6 S: W/ q, p2 t' \- c8 b# g

  ~8 @" O( l6 r; C

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-6 13:17 , Processed in 0.044688 second(s), 32 queries , Redis On.

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