Linux经常使用命令中,有不少用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却很是实用的用法。html
tar是linux中最经常使用的解压缩命令。tar命令可用于处理后缀名为tar,tar.gz,tgz,.tar.Z,tar.bz2的文件。 涉及参数说明:java
-c 创建新的压缩文件
-r 添加文件到已经压缩的文件
-u 添加改变了和现有的文件到已经存在的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 支持gzip解压文件
-j 支持bzip2解压文件
-v 显示操做过程
-k 保留源有文件不覆盖
-C 切换到指定目录
-f 指定压缩文件
--delete 删除包中文件
--strip-components 去除目录
--add-file 向包中添加文件
复制代码
tar -cvf test.tar test1.log test2.log #归档多个文件
tar -cvf test.tar test/*  #归档test目录下全部文件
tar -cvf test.tar *.log  #归档全部以.log结尾的文件
复制代码
因为这种方式不会进行压缩,仅作了归档,所以速度极快,同时占用空间也较大。linux
这种方式打包对文件进行了压缩:正则表达式
tar -zcvf test.tar.gz file1 file2 #打包,并以gzip压缩
tar -jcvf test.tar.bz2 file1 file2 #打包,并以bzip2压缩
复制代码
若是不想解压,只是想查看压缩包中的文件内容,可使用-t参数:算法
tar -tvf test.tar #可查看test包中有哪些文件
复制代码
有时候在打包后可能须要删除源文件,但一个个删除显得麻烦,咱们可使用--remove-files 选项:编程
tar -zcvf test.tar.gz test.log --remove-files
复制代码
对于某些目录下的文件,可能只须要打包部分文件,所以可使用--exclude选项排除一些不须要打包的文件:bash
tar -zcvf test.tar.gz --exclude=test/*.log test/* #打包test目录下全部文件,排除以.log结尾的文件
复制代码
这里用到了--exclude选项,支持通配符和正则表达式,所以也很是强大。微信
例如,压缩包中已经打入了test以及其余文件,如今你只想更新压缩包中的test文件,那么你可使用--add-file选项:网络
tar -tf test.tar --add-file=test #只针对tar包
复制代码
向tar包中增长文件可以使用-r参数:数据结构
tar -rf test.tar testfile #在test.tar包中增长文件,只针对tar包
复制代码
在不解压的状况下,可以使用--delete选项删除包中的文件:
tar --delete -f test.tar test1 #从test.tar中删除test1文件
复制代码
tar -xvf test.tar.gz
tar -xvf test.tar
复制代码
tar -xvf test.tar.gz -C dir
tar -xvf test.tar -C dir
复制代码
例如test.tar.gz包中文件状况以下:
1.txt
log/
log/1.log
log/2.log
log/2.log
log/4.log
log/5.log
复制代码
若是咱们只须要解压出log目录下的1.log,只须要执行下面的命令:
tar -xvf test.tar.gz log/1.log
tar -xvf test.tar.gz log/1.log -C test #将1.log解压到test目录
复制代码
压缩包中的文件可能存在多级目录,常规方式解压出来后,对应目录也会存在.若是只想要压缩包的文件,能够去掉目录结构(注意:同一文件夹下文件名不能重):
tar -xvf test.tar.gz --strip-components=1 #去掉一层目录
复制代码
当前目录可能已经存在包中的文件,若是不想解压出来的文件覆盖当前已存在的文件,可以使用-k参数(会抛出错误信息):
tar -xvkf test.tar.gz
复制代码
前面所提到的解压或者压缩带的f参数须要放在最后,由于它指定了压缩包名字,不然会出现解压或压缩失败。
zip和unzip命令主要用于处理zip包。
涉及参数说明:
-d 从压缩文件内删除指定的文件。
-f 此参数的效果和指定"-u"参数相似,但不只更新既有文件,若是某些文件本来不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
-j 只保存文件名称及其内容,而不存听任何目录名称。
-r 递归处理,将指定目录下的全部文件和子目录一并处理。
-u 更换较新的文件到压缩文件内。
-v 显示指令执行过程或显示版本信息。
-y 直接保存符号链接,而非该链接所指向的文件,本参数仅在UNIX之类的系统下有效。
- <压缩效率> 压缩效率是一个介于1-9的数值。
复制代码
zip -r test.zip test/ #打包test目录下的文件
zip -rj test.zip test/ #打包test目录下文件,且压缩包不带test目录
复制代码
zip -r8 test.zip test/* #数值(1-9)越大,压缩率越高,耗时越长
复制代码
前面的命令只能打包普通文件,若是想要打包符号连接文件,则须要使用参数-y:
zip -ry test.zip test
复制代码
有时候须要向压缩包中增长文件,但又不想从新解压打包,可使用参数-u:
zip -u test.zip test2 #向test.zip 包中增长test2文件
复制代码
微信公众号【编程珠玑】:专一但不限于分享计算机编程基础,Linux,C语言,C++,数据结构与算法,工具,资源等编程相关[原创]技术文章。 原文地址:www.yanbinghu.com/2018/10/19/…
压缩时若是须要对压缩包进行加密,可以使用-P参数:
zip -r test.zip test1 test -P 66666 #使用密码66666加密
复制代码
zip -d test.zip test #删除test.zip包中的test文件
复制代码
涉及参数说明:
-l 显示压缩文件内所包含的文件
-j 只保存文件名称及其内容,而不存听任何目录名称。
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该
-v 显示指令执行过程或显示版本信息。
-d 指定解压目录,目录不存在会建立
复制代码
unzip -l test.zip #能够看到压缩包中的文件名,日期等信息
unzip -v test.zip #查看更多信息,例如crc校验信息等
复制代码
unzip -o test.zip -d dir #讲test.zip解压到dir目录
复制代码
若是不知道须要解压的文件名,可先查看包中的文件,而后使用下面的方法:
unzip -o test.zip "1.log" -d dir #解压包中的1.log文件到dir目录
unzip -o tet.zip "*.log" -d dir #解压包中全部的log文件
复制代码
压缩包中有多层目录结构,普通解压仍然会保留目录结构,若是只想要压缩包中的文件,可使用-j参数:
zip -oj test.zip -d ./temp
复制代码
jar包是java归档包,但一样可用unzip解压查看里面的文件:
unzip -o java.jar -d dir
复制代码
涉及参数说明:
-k 保留源文件
-d 解开压缩文件
-r 递归处理,将指定目录下的全部文件及子目录一并处理
-v 显示指令执行过程
复制代码
tar命令带有-z参数,而且打包成tar.gz文件时,便调用gzip进行了压缩。gzip对文本的压缩率约有60%~70%,压缩包文件常以gz为后缀。使用-k参数保留源文件:
gzip -k ./* #当前目录下全部文件进行压缩,每一个文件一个gz包
gzip -rkv ./* 递归压缩
复制代码
解压也很简单:
gzip -dv test.gz
复制代码
tar命令使用-j参数将文件打包为tar.bz2时,便调用了bzip2进行压缩。bzip2压缩或解压后,会将源文件删除。若是须要保留源文件,可以使用-k参数:
bzip2 -zk test #压缩test文件
bzip2 -dk test.bz2 #解压
复制代码
rar和unrar命令并不是linux发行版自带命令,须要另外安装。常见用法以下:
rar a test.tar test #将test文件压缩为test.tar
rar e test.rar #解压test.tar
unrar x test.rar #解压test.tar
复制代码
压缩率通常来讲:
tar.bz2>tar.gz>zip>tar
复制代码
压缩率越高,压缩以及解压的时间也就越长。
对文件进行压缩可以节省磁盘空间,进行网络传输时,也能节省带宽,可是须要注意的是,空间和时间是须要根据实际应用进行权衡的。解压缩命令较多,为避免在其余平台使用不便,可选择经常使用命令进行压缩文件。有任何补充或建议,欢迎留言。
以上内容来自公众号【编程珠玑】