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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

4 G( i5 O6 n5 ^. L0 X
, D9 ]9 h8 G) M8 i: U1 b

, W8 j3 Z5 T$ a' ~) V6 G: V# Y# U, D前言
) {) C/ p8 Z# u4 x5 Y5 Y( }) ^' w7 U; b- o8 B# L
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
& ~4 {6 x) O9 v8 r* M% O( h& Ftar. U$ A; B5 K* N. ]  |7 x
5 e& a$ X8 M9 ?- ^  h- ]
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。/ y2 |" t- B0 O1 Y& e
涉及参数说明:
. r8 i5 _3 X& H* n; v% |# a; j6 `
-c 建立新的压缩文件
* q- o3 a3 v! m4 M) L-r 添加文件到已经压缩的文件
. _, h1 g! ]2 w* K( S+ M+ e-u 添加改变了和现有的文件到已经存在的压缩文件8 j; M0 m5 p  {: A6 W
-x 从压缩的文件中提取文件
& J6 u8 y$ _: N, d! b% W) |: q8 X-t 显示压缩文件的内容
) h' r; `  A3 G' \8 K8 I; T0 r-z 支持gzip解压文件( u2 U2 a1 V# M7 O" M( p- x
-j 支持bzip2解压文件
* x* b# V# ?: l5 x-v 显示操作过程
) b4 S7 [# T6 n7 V-k 保留源有文件不覆盖
  ^% \, s4 h; s; d' l5 O1 @-C 切换到指定目录5 \1 ]" v/ c! t. m
-f 指定压缩文件
5 ^# a1 e  K* {: [3 o. F# _8 b- X7 b5 w
--delete            删除包中文件/ `8 q  T- {( N$ z, J
--strip-components  去除目录4 c/ m5 T# N+ i2 f) C% d: ^" Y
--add-file          向包中添加文件
' t' |+ D8 Q/ h7 ?, [+ ~- z3 n压缩4 X1 x' g1 N7 J

% I. m2 J  r' ~$ c" |$ W归档tar包,不压缩" ^, q3 A5 J2 |. C  s
$ ]9 W+ _: g: m7 k7 ~% v, k
tar -cvf test.tar test1.log test2.log #归档多个文件& u& m! ~) d$ i# E/ x1 e* s
tar -cvf test.tar test/*  #归档test目录下所有文件
( @6 m2 H( R" a2 X+ c8 Ntar -cvf test.tar *.log  #归档所有以.log结尾的文件 * F$ L& i2 H- Z7 ^' A) j* {2 i
由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
- u8 Z5 j0 {* Z' [归档并压缩为tar.gz或tar.bz2
6 V, n: n6 I: S8 @& @3 o0 `  r% ?  z3 ?
这种方式打包对文件进行了压缩:
$ T: v! I' Y. Ptar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩& n! w) F+ R8 W- Y! S8 y  Q4 K) [
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
" E& U. n; A# [6 O) z查看压缩包中的文件+ o4 P- Z1 f( |  q, n6 a$ R( i' C* q

% I5 @: b& ?5 f9 f1 y  Y如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
% Q1 f! L" o8 o: O; r$ Z( ktar -tvf test.tar #可查看test包中有哪些文件
) p7 T1 g  u6 u4 w. L( z7 i& |打包后删除源文件
' F! o, ^6 M( ?% i* d
* W! j% C% k! `9 E有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
0 z; _% n" a3 _. Ktar -zcvf test.tar.gz test.log --remove-files
/ I% q0 o: @9 U  s! T* Q打包除指定目录或文件以外的文件
8 P1 ?/ _6 B) i2 c/ Y5 y! H- d9 J
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:1 `7 ]; V4 H# V/ M. {; V# x
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
, n2 q  w- M4 d4 v这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
4 ~) E: F) K# d7 d: U$ o向压缩包中更新文件
# c: w: Y0 `4 O: s3 @( L2 F* S# j2 Q* V# Q
例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
7 y% I1 X& G& t+ y* @tar -tf test.tar --add-file=test #只针对tar包! c% W  O3 X4 @3 E4 e! w' o9 T& T
向tar包中增加文件
$ A. q: F( e: A+ M( Z/ p. t$ d1 n' V( u; G0 v4 `7 h/ Z8 b4 ~
向tar包中增加文件可使用-r参数:
; ]4 [6 w/ S# G- l. atar -rf test.tar testfile #在test.tar包中增加文件,只针对tar! e9 x6 n9 W6 S$ K2 p" X/ m
删除压缩包中的文件8 d* L8 U+ p- ]' Z( X

( X/ H( Q/ G7 A2 P9 H7 B7 Y1 i在不解压的情况下,可使用--delete选项删除包中的文件:
; D/ `2 u/ y( ^4 @: r# Z7 dtar --delete -f test.tar  test1 #从test.tar中删除test1文件5 i* j- s. M- G2 h1 m+ }
解压
  p+ {: r0 q3 f' a. J& E$ `" r$ _# a7 b$ s  x: @
解压tar.gz和tar包到当前目录
3 p) a/ X8 n, t; v. z# _. i. G( x, f( f
+ q% ?+ T: O* y% q- Y3 m# Ztar -xvf test.tar.gz
% B% O2 {) O  @& H& Btar -xvf test.tar 6 U+ l: F- i! D) o
解压到指定目录
, e/ t& E( t0 p# V3 C2 N7 L5 p2 Q0 r' \3 q, d0 d
tar -xvf test.tar.gz -C dir% R/ ~5 w  V. J/ d9 ^& Y7 J9 e7 F3 Q
tar -xvf test.tar -C dir; z  `- r3 a; g/ J  k; r( C* D
解压包中指定的文件* }6 u: B9 E9 D1 r! w  a) e, g! ?" r
& I) i* `2 u# M( C3 K# [7 q4 Y
例如test.tar.gz包中文件情况如下:
4 [, B& A0 n) L: o8 _: p% Q+ O1 g1.txt
9 j) S) S6 u) A  T/ N! ~log/
7 b" {' R8 ^/ W1 |  J, Ilog/1.log3 U0 u; j' V( o' O6 j
log/2.log
1 ^1 p& p5 Q0 R/ P. @! }) k( vlog/2.log
2 e' y) v% g) j7 m  dlog/4.log3 m$ U5 l* a* U0 b
log/5.log2 r: q' s8 f5 F2 M: S
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
/ P, |6 C# I0 T! dtar -xvf test.tar.gz log/1.log
8 L; `3 r; x0 l" Y) N9 w. v% M6 Ytar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录) O1 |+ ~2 B" W! a
解压时去掉目录结构
" ^. ?  K1 m/ D2 G7 q9 l
/ g8 Y3 ?7 f/ j压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
+ W9 j- V4 R+ F) j0 {, ptar -xvf test.tar.gz --strip-components=1 #去掉一层目录
% @- q8 v3 _/ ^9 k解压时不覆盖原文件: r$ Y2 X! r& p* E: a' b4 m
9 E+ H6 Z! v( d( u4 T- G6 G) W
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):' i$ s0 x5 d2 L
tar -xvkf test.tar.gz
, }7 E$ k0 `  p特别提醒8 i" W, a9 ^* U' G7 L! d7 E5 D

- g- q5 g1 V4 b  f前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
. t/ F0 E! c9 d! @zip/unzip/ P  k) _- Z, Q0 M6 O2 T& Z# {! m; K+ ?
% R1 e- A  C" w; o9 r. s& \2 B* `. U
zip和unzip命令主要用于处理zip包。$ p: f# k# T( t! T: q" H, }8 K
压缩
' D, L$ ]' ]' G% a! u$ f
! `8 U( W( x0 q% {: x! ~涉及参数说明:8 N# Z( u/ g1 D0 n1 M
-d 从压缩文件内删除指定的文件。
8 ~: P0 X% `  S* ]) I6 t5 P-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。0 T& k$ b7 o6 _3 o# C0 v/ v
-j 只保存文件名称及其内容,而不存放任何目录名称。
* k$ y$ c4 a0 d$ k8 V-r 递归处理,将指定目录下的所有文件和子目录一并处理。
( S# X8 e4 ~5 [& E# H: F, v4 P, o-u 更换较新的文件到压缩文件内。' o( m* x, f7 }0 ?7 r7 E
-v 显示指令执行过程或显示版本信息。( I9 p3 Z. S% Y3 L, i
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。1 A7 w, J. [  P
- <压缩效率> 压缩效率是一个介于1-9的数值。3 W3 z5 n2 F3 I6 \* Z0 e# E1 O
压缩文件. x* c! C( D  O0 H7 r7 u" P

% Q' O' {' D5 c# b9 Vzip -r test.zip test/ #打包test目录下的文件
7 C, j, Q) q+ L8 Zzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录' d" d/ F. s0 F+ Z  H. L- L
指定压缩率打包文件
) e" B* [! a: E+ r
/ O4 J# T8 c' T! ~7 I4 U/ {zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
$ a9 Z' `/ S; K6 X  Z打包符号链接文件' v. b6 e3 B7 Q& c# l  a0 ^

8 `6 ^6 Z5 |1 i1 B, z7 ?9 S" x% ~! `前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
6 D" A# D( L. f! }: Y7 A$ s) ozip  -ry test.zip test9 ?( u' u4 U* T0 R8 h% A) N; F
向压缩包中增加或更新文件
, B$ [& p& l, E1 y# i2 P1 f
, [3 T8 X) S; J( o+ k有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
, {# k% f# F6 {& yzip -u test.zip test2 #向test.zip 包中增加test2文件# R9 q6 s9 O$ @: C
压缩时加密' G* w# g: @7 E# B' a" [

- m) q& F- S7 J- }7 F% r压缩时如果需要对压缩包进行加密,可使用-P参数:
* Z3 S9 I. O# w! M3 i( Szip -r test.zip test1 test -P 66666 #使用密码66666加密
6 p' i/ b7 N* |8 m- B* G删除压缩包的特定文件% f" n4 Z. {3 _# }8 D# F4 F3 m% c
' W7 |+ [0 a2 J7 [! g- t( u
zip -d test.zip test  #删除test.zip包中的test文件
+ h- M7 n5 _& U/ h. u, \- d. r解压* c" {- j! o! Z4 s
+ N5 O' g: z& N0 X" m
涉及参数说明:" A# A5 R9 L- l7 D4 g$ t, q
-l 显示压缩文件内所包含的文件: A1 Z' b: q( M; r8 J/ z3 h. m
-j 只保存文件名称及其内容,而不存放任何目录名称。+ k3 C+ W0 u# U9 {
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
$ g, Y& Y5 \# l; ]" z) r8 t7 g- F-v 显示指令执行过程或显示版本信息。: D+ C! l9 t$ A, o2 U
-d 指定解压目录,目录不存在会创建+ ?) y% F  b3 t  ]9 V5 Z; l4 r! g
查看压缩包中的文件信息
) k$ ]; s! W4 G3 I
' U/ i1 Q2 B6 F+ @( z! H' G$ P/ Zunzip -l test.zip #可以看到压缩包中的文件名,日期等信息9 i. X$ f; }" }& H3 h: D9 ^
unzip -v test.zip #查看更多信息,例如crc校验信息等) `4 f0 T+ M) M
解压压缩包4 \. ?0 j) D1 f- s3 B

3 d: R$ m4 q4 _8 v. @  X4 uunzip -o test.zip -d dir #讲test.zip解压到dir目录0 z0 V1 Y" M2 l& `& Q9 v- N
解压包中指定的文件& J. I1 _" \, _5 ]/ F, O7 F

: S) W# ~6 S1 _" O' h, O如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:0 S& u7 _, Y8 h8 C' {( W3 Q
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
  m& x9 y9 N5 _unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
( ^8 |' I' p9 J, N+ Q5 ?9 W. Y解压时去掉目录结构
0 f( X" x  Z& V( W1 k0 q0 M8 b
( {; a. D4 l- V0 ?: H压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
! Q7 v, }. I4 c, w7 J9 E! Pzip -oj test.zip -d ./temp    }  l% c5 C4 F. b8 F' c) x
解压jar包  m7 z0 ^: N9 ?! w
! I* J' t% M& h& p4 d* v3 c
jar包是java归档包,但同样可用unzip解压查看里面的文件:) a2 r5 I+ G* w
unzip -o java.jar -d dir
6 B8 n: l) w2 qgzip3 T( m& v8 w8 W* s

7 n- q* G0 K0 a" X+ s8 T; D涉及参数说明:: H6 z/ I) L; y) g
-k 保留源文件
+ m' e6 a/ v! l* M2 ?1 \-d 解开压缩文件  ^7 {  L+ J( J
-r 递归处理,将指定目录下的所有文件及子目录一并处理
, a, @1 X# E" y) W$ b-v 显示指令执行过程
% e9 b8 A& d5 r# Z/ Ptar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
5 B+ J8 O( i0 S6 e! }. Hgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
2 w3 l8 W: F# ]9 }0 S. Zgzip -rkv ./* 递归压缩
' ~0 R- ^- d0 v  d8 M" H% a/ R+ k解压也很简单:
6 v; c# U1 G+ Hgzip -dv test.gz 1 P4 A, T# j7 C0 Z
bzip22 r: b& P4 j, \  F

8 c! L! i$ |2 h" |, }8 S# _tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
% y/ t) O* ~9 T. l0 n; T0 pbzip2 -zk test  #压缩test文件
; z$ Z% J+ A& D  G- j8 Hbzip2 -dk test.bz2  #解压/ f# p' t- _5 ^! Z2 D
rar/unrar
& j  X8 k% M5 R1 a6 N/ D3 A5 `5 C& T! u  W( P
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
' K1 F8 I% m8 D+ a0 [9 d8 lrar a test.tar test  #将test文件压缩为test.tar
1 g7 A8 c* {" Irar e test.rar       #解压test.tar3 ]8 [1 z: e8 v# E; L
unrar x test.rar     #解压test.tar5 ~$ W% Y$ c8 Y  |4 Z0 J
压缩率比较9 U3 ]# x/ o9 _0 }4 g: ?' H1 v# K
* M7 u2 O6 X3 a( s" @: b# v: P, R
压缩率一般来说:
. V* J' T$ I) c. W+ Gtar.bz2>tar.gz>zip>tar
, I% ^  U$ C3 I. a' ?压缩率越高,压缩以及解压的时间也就越长。
5 d* B. ]; b4 q* m2 S1 h. H总结
, Y6 k+ P9 |3 Z, N9 i* r' C
$ Z5 c) i! g9 U  j; v( B. a/ X对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。( P$ D: l1 x+ N
有任何补充或建议,欢迎留言^_^。) C& E* m$ q3 x$ u+ h* L4 P+ ^. j

: O7 ]- w' h$ ]9 O3 k( `+ m
/ i2 L" `  q* _$ u6 c5 b1 f' `
0 E) e& m4 j- X3 ]. B& e4 {

; ^0 z  P( e# ~+ D( s3 b" b' b

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-29 00:50 , Processed in 0.055110 second(s), 32 queries , Redis On.

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