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

 找回密码
 立即注册

手机扫一扫,访问本页面

开启左侧

Linux常用命令-解压缩篇

[复制链接]
admin 发表于 2020-6-28 13:08:57 | 显示全部楼层 |阅读模式
* H* l- m% u* k8 K' ]6 K

4 d- N5 U6 _4 c) x9 P0 \: s

/ I/ O4 r' C* W6 U4 H前言
) x) s2 e/ J) k. Q3 j2 e- n5 [! l6 a+ |/ D) t) i! H, a. O
Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法。
. Y8 l7 X9 I3 Dtar% y( i1 ?. |+ m; [9 P) k8 M
6 ]6 M6 K3 Y1 N0 }7 P* c1 K
tar是linux中最常用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。
% R. ~! p5 [: t% z% z: l涉及参数说明:
4 o. w% L0 [/ F  l& T1 u; J
-c 建立新的压缩文件
7 }/ T  O# m  }  M-r 添加文件到已经压缩的文件
3 a8 w$ P  [7 y" l-u 添加改变了和现有的文件到已经存在的压缩文件5 b4 a- @" B0 Z' E/ @* L$ N: D3 t9 x
-x 从压缩的文件中提取文件
9 O, j$ m) _1 L" Q-t 显示压缩文件的内容2 ]* N5 L  a  V; S8 c+ W
-z 支持gzip解压文件
$ N( L& g7 }3 `( N" f( w) d-j 支持bzip2解压文件1 i! ~+ I. D# E5 A6 ~% I
-v 显示操作过程4 [( A) A3 D' b
-k 保留源有文件不覆盖
$ A4 T& k/ `4 y-C 切换到指定目录
7 o3 ]9 G- O, e* V. y% Q6 I+ s/ B-f 指定压缩文件7 k9 d* L( G6 {5 G3 i

% |9 E1 {/ J* ^# N  L  y/ l# C% }--delete            删除包中文件
/ l; x- P6 `& s) [# f--strip-components  去除目录
* U0 m7 r( K' O  F/ X7 J--add-file          向包中添加文件, q8 ^7 ~6 g( _- X
压缩
9 \* k+ J4 ~* b) x4 b5 l
2 g, q1 a; I8 S: M7 C$ Y" L' L, f归档tar包,不压缩6 ]# G1 k+ T8 U& E2 K

& U5 R3 y) s8 D7 U" Y' Ytar -cvf test.tar test1.log test2.log #归档多个文件: A! C  c* i0 \% i
tar -cvf test.tar test/*  #归档test目录下所有文件
# X, V# |. H6 Z! K. O- q: [tar -cvf test.tar *.log  #归档所有以.log结尾的文件
, P$ X/ k. c7 e由于这种方式不会进行压缩,仅做了归档,因此速度极快,同时占用空间也较大。7 ^' G6 p" n" `& A# z+ W& L. Y
归档并压缩为tar.gz或tar.bz2$ ?# F$ j8 u, `: Y, ]
; l1 x1 d# c$ i# B" c
这种方式打包对文件进行了压缩:; x! y, q( s' X5 b8 {3 t
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩' ?) j% e0 k# S! D
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
* M3 h; X7 L3 v. \5 J9 j查看压缩包中的文件: u% |% c7 m5 }/ l$ S: X( _4 f
4 e6 y0 V: s+ h; ~% [* |
如果不想解压,只是想查看压缩包中的文件内容,可以使用-t参数:
$ b2 [4 }# @! s- C5 t! P" ctar -tvf test.tar #可查看test包中有哪些文件
) H! R( B& F, l& n打包后删除源文件$ N  G, R& L6 z! z
) m, _1 P6 F- q
有时候再打包后可能需要删除源文件,但一个个删除显得麻烦,我们可以使用--remove-files 选项:
$ j- f" J: C* {8 u" V9 @" ltar -zcvf test.tar.gz test.log --remove-files " j. ]5 N/ `& O" O
打包除指定目录或文件以外的文件
# m+ a4 W* h4 z  x- d+ ?" \
, o6 _" p% Y: Z( @对于某些目录下的文件,可能只需要打包部分文件,因此可以使用--exclude选项排除一些不需要打包的文件:
5 U+ I; p6 n4 {tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下所有文件,排除以.log结尾的文件+ m: X+ m5 l' Z/ C% d
这里用到了--exclude选项,支持通配符和正则表达式,因此也非常强大。
4 f, o/ [: m) Q$ o& @! _向压缩包中更新文件
- N6 q0 U! b; X. o4 p
4 ^) D" m% c6 X' s( D) Q- F例如,压缩包中已经打入了test以及其他文件,现在你只想更新压缩包中的test文件,那么你可以使用--add-file选项:
1 ]" ]$ y7 y  L5 a: G% Gtar -tf test.tar --add-file=test #只针对tar包
9 z" w0 ?; z/ G( L3 H向tar包中增加文件  U# K4 E  V7 ?; q& C
8 y; p" Z+ g4 I; e8 d9 q
向tar包中增加文件可使用-r参数:
5 ]$ P+ w" I. Y2 G$ |0 ltar -rf test.tar testfile #在test.tar包中增加文件,只针对tar' d' C+ o# m6 p2 |* ^5 O
删除压缩包中的文件
7 G4 @" T; k' m+ i; I5 y1 I; E  ?, @- t6 [. b
在不解压的情况下,可使用--delete选项删除包中的文件:$ ~1 h' I8 _* t9 x4 {7 d, l
tar --delete -f test.tar  test1 #从test.tar中删除test1文件% R4 I7 c2 |. M, C
解压
5 U1 _4 L) b( R1 p9 q/ O, Z" `
解压tar.gz和tar包到当前目录0 T5 u+ S  J( w( L6 J
: g8 t- ~$ d9 {7 R
tar -xvf test.tar.gz2 o  }2 S% w- L2 b
tar -xvf test.tar
0 q8 q2 ]/ O# }, O& }2 r8 |3 M0 X  G解压到指定目录
2 y/ s1 W! h" [- w' U
' H# ^1 F7 e; Q% Q5 Atar -xvf test.tar.gz -C dir. R9 l9 P/ k3 l% X6 ]0 ]* i
tar -xvf test.tar -C dir
& f; f. g# `# j- k& Q7 b解压包中指定的文件
' b2 C7 T9 T' P+ X0 M
" C& d( {( [- e! ]例如test.tar.gz包中文件情况如下:
9 @( f. o- T- n8 ]3 U) H+ L( f1.txt
, `2 {- p) q( j4 u+ I; |0 Wlog/
6 \, F' l0 N( w) ~" Flog/1.log
4 C1 @% q7 v& l" j8 F0 Flog/2.log4 q$ w$ @' r2 q4 P8 a* g
log/2.log% s2 f1 ?# H( n& \; L( v( W1 A
log/4.log; G( F" k) R0 f  n4 o
log/5.log
: P# M- V) T0 H如果我们只需要解压出log目录下的1.log,只需要执行下面的命令:
7 v- L. z  g- ?! ~tar -xvf test.tar.gz log/1.log1 _2 b% Y* N2 W
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录8 w% z' Q! o& G+ |2 l3 n' f
解压时去掉目录结构! |9 D0 K9 Z; ]0 O- n$ w

* C$ ~& Y% o; M' m压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在。如果只想要压缩包的文件,可以去掉目录结构(注意:同一文件夹下文件名不能重):
8 z! }, E2 C* k7 n( ctar -xvf test.tar.gz --strip-components=1 #去掉一层目录0 e& K! C: [( u, l
解压时不覆盖原文件
  [% A, I% {- g2 O' d- w
1 b3 D: L2 y: \+ z3 t( Q2 C! |当前目录可能已经存在包中的文件,如果不想解压出来的文件覆盖当前已存在的文件,可使用-k参数(会抛出错误信息):7 G: H5 O& B: Z- b: k# u
tar -xvkf test.tar.gz
; M, P5 }3 I& z) ~: `  z% L特别提醒
4 |5 b  x  {$ S# y
) d- J! j# e0 Z5 o. w: _! g7 T* b" Z前面所提到的解压或者压缩带的f参数需要放在最后,因为它指定了压缩包名字,否则会出现解压或压缩失败。
' ?& |- K3 u% X" b* [2 Tzip/unzip3 S* U! ~1 u0 P) i0 Y" E
" ^. d+ J2 i5 Y) d! d% N5 Q* {
zip和unzip命令主要用于处理zip包。8 c% Q1 }+ y7 [4 X
压缩
* O2 Q* k  S. a& y5 p$ T
8 I6 z1 a8 O1 ]& A$ A涉及参数说明:
# r$ D" S7 M2 P0 r-d 从压缩文件内删除指定的文件。& L0 W; v( A7 |! `2 M- M
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
9 X# E% D, d$ U5 P3 |, ~1 ]-j 只保存文件名称及其内容,而不存放任何目录名称。0 `: F5 u% ^; I) q/ _
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
& ]& w& T5 m" g4 m# p-u 更换较新的文件到压缩文件内。
# W. f5 D* s4 Z4 n-v 显示指令执行过程或显示版本信息。
0 C. F1 w& h% t-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
- J3 _5 D# j! a8 u- <压缩效率> 压缩效率是一个介于1-9的数值。! i  m9 }5 |0 O8 f: [8 Y3 M9 w
压缩文件
) I, _$ E" O) o0 Z" S! A( J1 E# x' ]# Z0 d, A
zip -r test.zip test/ #打包test目录下的文件
4 @5 `; N0 I3 p  Z3 kzip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
* \" ?' q: L& a# y. C' M: r指定压缩率打包文件
6 @7 T6 r$ v! T+ @- S2 c* k/ s& r5 D* Q0 g0 z4 g+ [
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
1 x4 b) K: U1 x* O+ s5 G* @打包符号链接文件
/ L, l/ X4 E# ]6 H
# E4 [7 S% `0 ], N前面的命令只能打包普通文件,如果想要打包符号链接文件,则需要使用参数-y:
: E, j9 Q' X8 e, lzip  -ry test.zip test
$ ?# k" p$ @2 _7 P3 j  K向压缩包中增加或更新文件# X1 x$ o, b5 T( c

& K  `% ^- ~/ v1 f& E  O有时候需要向压缩包中增加文件,但又不想重新解压打包,可以使用参数-u:
6 A( ~- v8 g4 k" }zip -u test.zip test2 #向test.zip 包中增加test2文件/ v$ k& |% X% E
压缩时加密. ]2 i: X8 i% ^1 C
% L* E( t; d$ T/ T: N
压缩时如果需要对压缩包进行加密,可使用-P参数:
. J$ l, K' B5 d' H; E  czip -r test.zip test1 test -P 66666 #使用密码66666加密7 `: d/ ~- ^5 g/ [; A9 `( N* X
删除压缩包的特定文件
/ g$ D, x# ~/ |$ ^! w) w- y" S8 t( d# u/ z9 u/ ^/ H' Z
zip -d test.zip test  #删除test.zip包中的test文件
/ q7 G) [  Q% E3 _% r- b2 v7 g7 e解压
& r" d& s( U8 D: E( [
3 X/ @2 j" V# {2 V' z涉及参数说明:8 [5 {! s/ W% c/ z
-l 显示压缩文件内所包含的文件' j4 t1 S, Q! d, B
-j 只保存文件名称及其内容,而不存放任何目录名称。5 B+ E  O* s' S8 T, J
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该7 u0 h1 A+ p  F6 |1 q
-v 显示指令执行过程或显示版本信息。$ _  ?# Z" k0 T4 ?, U5 N, h- f3 _
-d 指定解压目录,目录不存在会创建
( c; ^" U- r& a7 u查看压缩包中的文件信息
: [1 Z. a( b  P% |/ y* U/ e) M" q% R; n/ K  G
unzip -l test.zip #可以看到压缩包中的文件名,日期等信息
3 J7 `( p  b% u( h/ h/ C1 A  ^unzip -v test.zip #查看更多信息,例如crc校验信息等- B7 z- P) e  }$ V5 `
解压压缩包
  b) a. H4 D% X+ A3 ]- X
1 x' F+ B. ?' L2 o/ Gunzip -o test.zip -d dir #讲test.zip解压到dir目录
' y* v. ^8 C& @* R解压包中指定的文件( m8 n1 G: K/ I+ P) b  z. }
& c' c6 R! f( k* F: [0 z4 [0 U
如果不知道需要解压的文件名,可先查看包中的文件,然后使用下面的方法:
5 Z& o/ c0 d8 H9 t) e1 n, sunzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
2 T/ O* S" s6 X/ f) ]unzip -o tet.zip "*.log" -d dir  #解压包中所有的log文件
* w) w; W4 L% @# i8 b9 p4 q' j" d解压时去掉目录结构% M5 @$ i" g0 H) i" x; k
" X& P4 R* b) A" h# u
压缩包中有多层目录结构,普通解压仍然会保留目录结构,如果只想要压缩包中的文件,可以使用-j参数:9 Y0 c0 a* B4 P4 d
zip -oj test.zip -d ./temp  
/ Q/ D& S/ B5 k解压jar包
9 p3 D* b+ a; C' N# R/ X4 P
' n) x& @" Q& ~jar包是java归档包,但同样可用unzip解压查看里面的文件:7 T# R* P) Y) u5 X+ X" x* y& e
unzip -o java.jar -d dir5 ]" W; \' a, G+ S5 U
gzip( X2 o7 @& h+ H! Y

/ u/ ^! \5 D5 J, O' w涉及参数说明:- f, O* ^2 U9 S: v. g6 Z) I
-k 保留源文件. h2 t" _3 l) d1 G- Q% l0 o7 H4 l
-d 解开压缩文件
: Z  Z0 z' p; i. o( Y* \3 h: I/ E-r 递归处理,将指定目录下的所有文件及子目录一并处理
. D; D2 t+ z$ y1 ]* L-v 显示指令执行过程) g2 m' i5 W9 |# ?% z+ K
tar命令带有-z参数,并且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:/ g, o0 g5 n6 H  E, K
gzip -k ./* #当前目录下所有文件进行压缩,每个文件一个gz包' j9 f' V9 c- ?& o9 L6 g1 K
gzip -rkv ./* 递归压缩+ l6 g3 t9 H" v" h
解压也很简单:
# g% e( v2 U3 y* V$ F5 r1 Ogzip -dv test.gz
# x0 P7 u: G: Y4 g2 ]  a' U% ^; hbzip2
2 v8 k8 @% S& I8 y$ M6 U, b8 B1 _/ Y1 L& k
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。如果需要保留源文件,可使用-k参数:
4 p" M! l& |+ Fbzip2 -zk test  #压缩test文件( Y) B' {! i6 f4 p! d( \4 U9 f
bzip2 -dk test.bz2  #解压/ B8 m# v% `7 M' T1 |$ U6 i
rar/unrar$ [0 n6 P$ G4 E- c4 |0 a) K3 }6 S

0 `5 P5 \$ s: Q7 ^' o5 j7 @+ crar和unrar命令并非linux发行版自带命令,需要另外安装。常见用法如下:
8 Y9 o8 Q/ W# Hrar a test.tar test  #将test文件压缩为test.tar6 Y& a" m$ u; R: n- V+ Q' w& E
rar e test.rar       #解压test.tar5 e- m7 A! a' M; w0 U/ L4 h
unrar x test.rar     #解压test.tar3 S: `0 f( f+ |+ v; D
压缩率比较
8 ~) i) |; I) o# v" m! \
) \  ]' a- y7 h3 j; h4 F9 f: a+ w压缩率一般来说:
  i( i5 v# Y$ w6 Q- P& qtar.bz2>tar.gz>zip>tar
; ^$ E' I3 }4 h  {! j1 L2 y2 D压缩率越高,压缩以及解压的时间也就越长。
" }7 I, u( x* H0 t% L6 Z总结
- `- T0 a- V- J- [  b5 ]) M* E3 b0 \1 A* [7 w( p) N, T
对文件进行压缩能够节省磁盘空间,进行网络传输时,也能节省带宽,但是需要注意的是,空间和时间是需要根据实际应用进行权衡的。解压缩命令较多,为避免在其他平台使用不便,可选择常用命令进行压缩文件。
/ G3 U; T; F# U( n  y+ T有任何补充或建议,欢迎留言^_^。. [, h$ ~" M7 e) L: b1 C, v7 T

5 M/ R1 o& V% M  T" B
5 m6 G* R% B: s1 X' C8 M- |& c2 j9 x0 L

6 `( B6 b5 Z+ ~3 o" L

微信扫一扫,分享更方便

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 23:48 , Processed in 0.059091 second(s), 43 queries , Redis On.

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