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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

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

- z1 h0 C) R0 |8 @0 t# b  J
8 J/ ~$ O/ R5 o

6 }- |0 z+ F$ N4 k) M  e7 k前言
; Y7 T6 t1 k/ q( H3 u2 N6 @3 a+ V) `! s+ l( ?! A4 o5 ]3 m' Y
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。) ~3 @6 R# y0 x4 H+ `( c4 }
tar
6 U- @3 @8 ^" S6 d# A$ m+ M1 X
: w7 Q. O' X1 U+ Otar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。  O7 K( L3 o) B1 {1 i" v7 ~
涉及参数说明:
; _3 _$ G& S/ R) y
-c 建立新的压缩文件' P. W" l6 s! m" ]
-r 添加文件到已经压缩的文件) e  T* h. _  E$ w' D: Y
-u 添加改变了和现有的文件到已经存在的压缩文件
, K1 y& m0 O: C2 g+ G% V. i-x 从压缩的文件中提取文件
& l" k: V+ G2 z+ a8 r-t 显示压缩文件的内容
' b7 v0 [& Z& [) n-z 支持gzip解压文件; |) y% J$ S( r. ]" O# h
-j 支持bzip2解压文件
" y/ q# |! g* f) Q7 h" y1 k6 ?-v 显示操作过程" \+ b/ H( ^. R! S
-k 保留源有文件不覆盖2 ~  t5 R9 V  q' [
-C 切换到指定目录
& R0 g1 |4 x4 C9 ~2 I-f 指定压缩文件
* X4 [! S0 E1 W6 W
6 b) `+ w& w4 X* [--delete            删除包中文件- o6 X7 g8 {9 V3 s' M
--strip-components  去除目录
9 e4 h4 s0 f5 s: `- c1 }--add-file          向包中添加文件
7 T' k- Y7 V0 E7 L+ e% o压缩
8 B" f1 g+ T8 d3 x# \( h7 W) I" R+ I+ Y9 C  M
归档tar包,不压缩, g2 F. F% m6 x3 n
( n% C) d& F& m" L
tar -cvf test.tar test1.log test2.log #归档多个文件
0 b; m; M5 }) q! @6 rtar -cvf test.tar test/*  #归档test目录下所有文件! l* U$ o. `1 e. F; \$ c# C
tar -cvf test.tar *.log  #归档所有以.log结尾的文件
% t- w) I% s1 x; w% [$ z由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。
# ?0 h( h! {$ y  U' B归档并压缩为tar.gz或tar.bz2
( N5 W0 L8 p! \8 |+ C2 b
: _. g: \7 i* \$ c9 `这种方式打包对文件进行了压缩:
0 M" ?6 r4 A3 y6 N8 t$ j. ftar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
$ ]! G6 g2 J, y5 [) h: \. d# Itar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩% @& X; t# F% K6 f. ~% J* p% _& Q
查看压缩包中的文件0 M8 N) |, b9 ~; p
) u* h! d5 ]" [* l8 K3 W8 O
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
, `: P7 g5 @1 J# p+ s8 `tar -tvf test.tar #可查看test包中有哪些文件
9 h4 q  ^2 n. H) J6 d打包后删除源文件% v6 `" E' I1 V
/ R6 v7 z1 g1 |4 I0 a. L1 x* k
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:5 b! ~* K$ z5 Y6 ]) C% s9 Z
tar -zcvf test.tar.gz test.log --remove-files 0 m: ^* `' p# T1 s, }% O
打包除指定目录或文件以外的文件/ K, `! C9 u' q/ s" F9 K4 w
1 F+ P' q! o$ j- E; r3 N( y
对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:8 s! u/ U2 G2 H* A% H& ]
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件
: J' V2 b8 z5 p4 b8 M8 b" p这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
) o0 T0 U- A. [$ }9 F5 b  H向压缩包中更新文件# l) I# N7 Z* _& N9 x0 R: X8 E

' H. b1 y0 {0 d& o" u& h例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:2 r, ]7 {, }1 D% r+ a+ ]' D
tar -tf test.tar --add-file=test #只针对tar包
: G# `) F0 n9 |" D向tar包中增加文件% S: W# \- v+ c

% g5 O; y, r' k% [1 y向tar包中增加文件可使用-r参数:- S+ `1 h  F9 Q4 c
tar -rf test.tar testfile #在test.tar包中增加文件,只针对tar4 I: t6 R" j- I2 a! M, r  F# b
删除压缩包中的文件
2 `6 s& O# r) F+ i0 G$ m6 j9 q1 ]9 R* B3 d9 e1 `
在不解压的情况下,可使用--delete选项删除包中的文件:; Y+ |" S  |/ ?. `% e( g3 m) \) [& F
tar --delete -f test.tar  test1 #从test.tar中删除test1文件/ I8 A- X" u$ {/ W  V
解压
0 W4 @2 b8 o: F
7 a' N& B! z# X. S解压tar.gz和tar包到当前目录- Q% b% |  J% g6 v; f
: }9 V7 V8 Z0 Q- [$ j9 \. ?
tar -xvf test.tar.gz
" g! m/ D- Q; D, Q( |9 Y7 ~2 |4 }tar -xvf test.tar
0 x& n1 q' b( e解压到指定目录
4 ]1 J5 W  N' [5 S- a  \. i
# U" V# `' {6 k( O5 l; N* F. Ftar -xvf test.tar.gz -C dir
0 K; r( _/ X; {4 A3 L2 ~, ytar -xvf test.tar -C dir
% A0 C4 p( x# U' ]7 Q0 }解压包中指定的文件
1 ]0 Q0 w3 K( C% L! y3 [! H8 K. b" N; @6 k
例如test.tar.gz包中文件情况如下:
' a0 E$ O* @7 N9 \. f& S+ l1.txt
6 ~( E- m3 ^9 g8 N6 M* ylog/# e& j7 n& m$ j/ e$ h9 I
log/1.log( |1 }1 v5 O6 s' v/ C. u! y# N1 \
log/2.log
) x1 T2 A, P* N: b: _0 V3 Q" ylog/2.log" J6 K, w+ {$ l9 ~6 o& |' v
log/4.log
, _. D8 U& Z7 J* p4 i1 ?log/5.log! W$ w$ ~: A! V4 Y% J7 L+ {
如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
- L4 U0 |! S1 ?: ?/ \! [  }" ztar -xvf test.tar.gz log/1.log5 a  H' l; p/ U% y
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
+ a1 w$ E) R' e. P解压时去掉目录结构
: e$ a5 l+ a( ]) g
3 T3 e  {/ P% l压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):1 A0 @4 `( [/ w: c# Q& L
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录7 ^: z( @9 h. o* B" B. T" n
解压时不覆盖原文件2 k/ }3 ^: I. S" V$ F$ o) L
6 e# w" n$ J/ a4 {1 E! [! E1 z' r
当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):! [( {& j* `% n" M# M/ `/ f
tar -xvkf test.tar.gz5 R! m) o$ Z; P# s1 G$ H' `3 W- C
特别提醒
, ?- u0 R! t( G, G5 b0 y7 A" P
3 j# R0 ^6 G/ D前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
. e) w& h) _. W" r; dzip/unzip
" m" _7 B' e2 Y3 y0 O
0 q! W% N! b9 d. dzip和unzip命令主要用于处理zip包。
7 c% f9 p! a5 Z( k2 z+ t压缩2 ^0 J+ y0 w5 P! e
( e2 C9 S7 h- C# X
涉及参数说明:
$ Q2 d$ }3 A$ A-d 从压缩文件内删除指定的文件。
6 m5 b2 e' i( E/ k-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。  s$ T6 [6 e- j$ M
-j 只保存文件名称及其内容,而不存放任何目录名称。
# t. \1 H5 \9 U5 ^  M1 L-r 递归处理,将指定目录下的所有文件和子目录一并处理。
6 D8 v* i9 J1 C9 }' F2 y-u 更换较新的文件到压缩文件内。; x/ l( I# L3 A( @, s( t2 X
-v 显示指令执行过程或显示版本信息。
6 g- x2 m1 K: }; J; W- s8 u-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。, i# h" i& @2 h) E2 W. d
- <压缩效率> 压缩效率是一个介于1-9的数值。' k! w! r' R- r5 {
压缩文件
7 g8 S8 ~; ?, g1 J1 |% R: h( n; j, M* K4 `! o7 R/ ~  C# F! M* E
zip -r test.zip test/ #打包test目录下的文件
9 U$ I2 n% T1 @' M% f4 I' Z! Xzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录+ L& S) l4 [. B5 N( G4 y
指定压缩率打包文件- m* {$ C# z  R* s% b7 \
. |0 p6 U( Q5 L" }. o4 L% B$ N
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长$ X& m. i/ R: j: g! \. M
打包符号链接文件
% ]$ Q" ?5 K, y7 R; R/ ?, |
( P" q* X4 H$ r1 f' N9 d前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:; @+ ]! [; g/ `9 H6 K
zip  -ry test.zip test
1 g! D) A8 I# P向压缩包中增加或更新文件
) ^+ k0 b! A, `" f& v. v' ]
- ^3 I# W- G9 |. i有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
7 K5 }  U7 y, P5 Izip -u test.zip test2 #向test.zip 包中增加test2文件
2 q! x6 Q6 C0 P+ x& @压缩时加密
$ c! j# ?7 n+ p5 B7 b6 I# _  M9 T" B; r6 _6 x. p9 v% k
压缩时如果需要对压缩包进行加密,可使用-P参数:, l# m' c% F. e3 z! H
zip -r test.zip test1 test -P 66666 #使用密码66666加密" z3 Y. `2 @! g( @: c# M
删除压缩包的特定文件
$ R' \7 a: k/ Y0 B# J0 ?6 x. z2 p1 G/ ^
zip -d test.zip test  #删除test.zip包中的test文件% _8 i9 ?# ~( c! u& ~' \# p2 N$ ]; y
解压
! u! s: \6 h$ _) M) `% ^6 T* s- o' L# e1 g4 O5 b# P/ e
涉及参数说明:
) K+ J% H, R& K2 z/ \-l 显示压缩文件内所包含的文件
% {2 T; e$ Y3 A# E0 i$ {-j 只保存文件名称及其内容,而不存放任何目录名称。( y0 N. ?8 |/ L7 x  V. A
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
8 @; U) ^0 a8 H* {5 V$ g' |8 ?-v 显示指令执行过程或显示版本信息。
! j. X8 c* T. h' |7 H% V-d 指定解压目录,目录不存在会创建% w1 W6 @) ^' T; J- P: M1 T# Y
查看压缩包中的文件信息5 y5 \. W9 ?4 O9 a; j( g

! S: r$ N* Z- i" cunzip -l test.zip #可以看到压缩包中的文件名,日期等信息
5 n) F, Q6 ~5 M, dunzip -v test.zip #查看更多信息,例如crc校验信息等
1 U; e6 {# a8 l- _& ]: S) q! I解压压缩包( ]% v+ f* O% U9 s4 Q4 E
0 G- o" }3 a# @: _5 @
unzip -o test.zip -d dir #讲test.zip解压到dir目录
  F8 q' p# t- K- o+ n0 p+ g% H解压包中指定的文件
: g) M# N7 o# q: @, b2 I8 a
. [6 f. s% e3 A% f' W6 _: W如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
' U9 d; ^/ I( Z# w) a( D: Nunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
- T0 T$ w3 a9 D; z6 h% z' Xunzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
& v( E! G( K# k解压时去掉目录结构; [2 a( e: S( F. u2 ~/ v
- Q5 c; ^) u9 e3 O( d) x6 g9 x
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:
& l0 S: `; K& D, r8 B6 x( h7 g2 Mzip -oj test.zip -d ./temp  
: U3 L- u2 C3 p" E+ @; N解压jar包
4 M) j+ P6 K" `2 W6 f& h( z8 j
* g9 Y+ z. a% K7 X  `jar包是java归档包,但同样可用unzip解压查看里面的文件:
$ s/ a8 V4 ~* ^+ t2 i; iunzip -o java.jar -d dir; ~1 D, h+ L# |! y% n4 k! }
gzip
$ R9 A1 G1 e+ p) W6 P( A$ ^1 ]2 {
$ A% s  ?/ V& T: e. d9 l涉及参数说明:
8 ^' o3 @, G* _) U-k 保留源文件
" N- O& [" D# S# E1 V! y8 r- ]. \2 q-d 解开压缩文件3 P, N+ U5 H0 \* R- `' L
-r 递归处理,将指定目录下的所有文件及子目录一并处理6 c" ]( r+ S. E9 c$ S5 Z
-v 显示指令执行过程- c# o& W! H2 V  ^, b4 p
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
' J+ g' [6 I- M) }2 hgzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包
6 R3 e* w2 Y/ Q" \7 L& ^$ ~gzip -rkv ./* 递归压缩
+ g! L9 s4 {! f- s% S解压也很简单:
2 y% W( Y4 B/ S+ {  ygzip -dv test.gz
+ F# U2 t1 g0 h" Ebzip2
- ?2 y9 S+ ?1 M
0 ?$ I. U9 ^, s9 a3 }  \6 V8 X5 mtar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:% ^5 q3 }. M- q2 E3 g# {( A$ {
bzip2 -zk test  #压缩test文件
6 t( X% y/ w$ Nbzip2 -dk test.bz2  #解压
" s! S9 q8 f- ?$ f2 ~! qrar/unrar
: ^) S) L; l0 g1 n( H4 O6 `3 q9 a: W" B3 k! a
rar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
- G! x6 Y3 ~0 c2 i- prar a test.tar test  #将test文件压缩为test.tar. i/ C' s! R9 l/ e  c
rar e test.rar       #解压test.tar
9 q; @+ u$ o! F% K3 N! dunrar x test.rar     #解压test.tar* W6 ]8 `+ f9 ]: F2 t& E
压缩率比较% {. ^- |' ^- d0 V' c  L0 A/ f8 ]+ G
) I/ _) m* r' z: x7 C: B
压缩率一般来说:0 k6 u4 }1 R/ R8 b2 i. d& A
tar.bz2>tar.gz>zip>tar# f" y* j! o6 h3 K! x; `6 t5 u
压缩率越高,压缩以及解压的时间也就越长。
! d7 E$ Q' b& t; D. @9 I4 z' J1 B总结1 m$ k  ?! A, i- g; S

: B+ y( ]% g9 x6 `7 @1 S5 A1 D对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
% g4 I/ N& L9 ?, m9 _# a有任何补充或建议,欢迎留言^_^。
- C* Y- A7 r6 F
" L+ X3 ~/ h( U' E, I# m! L6 y) ]9 t7 y" w$ {
! i- |" P/ i( E# g* R& `+ y, Z
* Y' t: f& y* ~( S6 [3 j# y# z$ v

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 13:21 , Processed in 0.068106 second(s), 33 queries , Redis On.

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