当前位置: 首页 > news >正文

linux环境下常用的打包、压缩、解压命令(tar、gzip、bzip2、zip)

文章目录

  • 前言
  • 基础概念
    • 打包/归档
    • 压缩
    • 解压
  • 打包压缩
  • 压缩解压命令
  • 总结

前言

经常使用电脑的人常常会接触到压缩文件,不管是软件、数据还是资料,下载之后通常就是一个压缩包,在Windows平台上如果安装了WinRAR或者360压缩,不管是什么格式的压缩文件,一般点击压缩文件右键选择解压选项即可,非常地方便。正因为长时间在Windows平台上方便的解压文件,导致我对打包、压缩的概念理解错误,结果在linux操作压缩文件时有很多疑问,今天终于明白了一点,专门总结一下,同时列举常用的压缩、解压命令,方便日后查找使用。

linux上操作压缩文件也是通过命令实现的,但是压缩文件的后缀有很多,比如.tar.gz.tar.bz2.gz.zip.Z等等,而生成和解压这些文件的命令同样很多,比如targzipbzip2zipunzip等,看得人眼花缭乱,记忆的过程中也常常出现偏差,不是命令不对应就是参数错误,特别是一些不常用的压缩格式,经常需要查询尝试,浪费了不少时间,其实造成这些问题的原因还是由于对打包压缩的概念不太清楚,接下来先了解一下这些概念。

基础概念

在Windows上经常直接在图形化界面上操作压缩和解压文件,导致我将这种操作行为带到了linux上,而实际上在linux上压缩和解压文件之外还有一个操作就是“打包”,原因就是linux的压缩和解压通常作用在一个文件上,如果想将一大堆文件压缩最终成为一个文件,需要先打成一个包,然后对这个包文件进行压缩。

打包/归档

打包或者叫归档,就是将多个文件和目录(也可以是一个文件)就变成了一个总的文件,但不是将所有文件进行融合,使用tar命令。

压缩

压缩是将一个大的文件通过特定的压缩算法尽可能变成一个小文件,可以减少存储空间,加快网络传输效率,使用gzipbzip2zip等命令。

解压

解压是将压缩生成的最终的小文件还原为压缩之前的大文件,可以使用gzipgunzipbunzip2unzip等命令。

打包压缩

通过上面的概念解析我们可以知道,我们之前所说的压缩操作通常是指打包和压缩两个步骤,由于linux大部分的压缩命令都是只能压缩一个文件,所以在压缩之前需要将待压缩的所有文件先进行打包,生成一个文件后再进行压缩操作。

明白了打包和压缩操作的含义,我们可以通过一些约定俗成的命名规则,选择合适的压缩和解压方法,比如下面这些文件:

  • xxx.tar:这是一个归档文件,也就是只通过tar进行了打包操作
  • xxx.tar.gz:这是一个压缩文件,打包之后,以gzip方式进行了压缩
  • xxx.tar.bz2:这是一个压缩文件,打包之后,以bzip2方式进行了压缩
  • xxx.gz:这是一个压缩文件,没有经过打包操作,只是gzip方式进行了压缩

如果能按照这些命名规则生成压缩文件,那么解压文件的时候会方便很多,但有时压缩文件的扩展名是不标准的,可以通过file命令查看文件实际的格式,使用方法如下:

[albert@localhost#15:03:05#/home/albert/compress]$file test.tar.bz2
test.tar.bz2: bzip2 compressed data, block size = 900k

[albert@localhost#15:03:24#/home/albert/compress]$file test.tar.gz
test.tar.gz: gzip compressed data, from Unix, last modified: Wed Nov  6 12:02:05 2019

压缩解压命令

压缩文件的格式和命令真的是太多,所以在此总结一份常用命令表格,方便日后需要的时候直接拿来就用,加快解决问题的速度。假设原始文件是a.log和b.txt,当前目录下还有一个output目录,可以作为解压后存放文件的目录,那么常用压缩和解压命令如下:

文件格式压缩命令命令备注解压命令命令备注
xxx.tartar -cvf test.tar a.log b.txt-tar -xvf test.tar -C ./output不使用-C则解包在当前目录
xxx.tar.gztar -zcvf test.tar.gz a.log b.txt-tar -zxvf test.tar.gz -C ./output不使用-C则解压在当前目录
xxx.tar.bz2tar -jcvf test.tar.bz2 a.log b.txt-tar -jxvf test.tar.bz2 -C ./output不使用-C则解压在当前目录
xxx.tar.Ztar -Zcvf test.tar.Z a.log b.txt-tar -Zxvf test.tar.Z -C ./output不使用-C则解压在当前目录
xxx.gzgzip -c a.log > test.gzgzip a.log前者保留a.log,后者直接删除a.loggzip -d test.gzgunzip test.gz不能指定解压文件存储目录
xxx.bz2bzip2 -c a.log > test.bz2bzip2 a.log前者保留a.log,后者直接删除a.logbzip2 -d test.bz2bunzip2 test.bz2不能指定解压文件存储目录
xxx.Zcompress -c a.log > test.Zcompress a.log前者保留a.log,后者直接删除a.logcompress -d test.Zuncompress test.Z不能指定解压文件存储目录
xxx.rarrar a test.rar a.log-unrar e test.rare选项换成x可以指定目录
xxx.zipzip test.zip a.log b.txt-unzip test.zip -d ./output不使用-d则解压在当前目录

分析对比上面的压缩也解压命令可以发现,tar这个命令可以将打包和压缩合并到一起,也可以将解压和解包合并到一起,只需要修改选项中的参数就可以调用不同的程序压缩或者解压,比如-cvf表示只打包不压缩,而-zcvf表示打包后使用gzip压缩,改为-jcvf表示打包后使用bzip2压缩,其实还有很多的压缩方式,可以参考一下tar命令的帮助文档,具体压缩选项如下。

压缩选项:
-a, --auto-compress 使用归档后缀名来决定压缩程序
-I, --use-compress-program=PROG 通过 PROG 过滤(必须是能接受 -d 选项的程序)
-j, --bzip2 通过 bzip2 过滤归档
-J, --xz 通过 xz 过滤归档
–lzip 通过 lzip 过滤归档
–lzma 通过 lzma 过滤归档
–lzop
–no-auto-compress 不使用归档后缀名来决定压缩程序
-z, --gzip, --gunzip, --ungzip 通过 gzip 过滤归档
-Z, --compress, --uncompress 通过 compress 过滤归档

总结

  • 上述这些命令只是基础用法,还有很多参数选型没有提到,比如tar -tf test.tar可以不解压直接查看归档文件中的内容。
  • gzip命令只能压缩一个文件,如果在命令后面添加多个文件,则会分别压缩生成多个文件。
  • 据说compress命令是一个相当古老的 unix 档案压缩指令,现在基本被gzip命令取代了。
  • 由于文中涉及的命令较多,难免有些笔误,为了不传播错误用法,我也进行了多次检查,如果大家还发现其他错误,欢迎批评指正。

相关文章:

  • MySQL数据库导入、导出、复制表、重命名表
  • Python操作Excel工作簿(\*.xlsx)
  • java对接银联商务公众号+服务窗支付(1)
  • java对接银联商务公众号+服务窗支付(2)
  • java对接银联商务公众号+服务窗支付(3)
  • java对接银联商务公众号+服务窗支付(4)
  • java对接银联商务公众号+服务窗支付(5)
  • java对接银联商务扫码支付
  • 报错:Invalid bound statement (not found): com.wshy.example.dao.UserDao.getUsers
  • Field userDao ....service.impl...'com.lzj.springcloud.dao.UserDao' that could not be found
  • java对接银联商务扫码支付(银联商务扫码支付文档)
  • Java中拦截器的使用
  • 记项目中出现的数据库若干问题和注意事项
  • 工行icbc 在线支付jar包下载及maven导入本地库
  • 工行聚合支付二维码扫码付对接流程及代码实现
  • CEF与代理
  • HTML中设置input等文本框为不可操作
  • leetcode讲解--894. All Possible Full Binary Trees
  • Logstash 参考指南(目录)
  • mac修复ab及siege安装
  • yii2中session跨域名的问题
  • 关于for循环的简单归纳
  • 聚类分析——Kmeans
  • 类orAPI - 收藏集 - 掘金
  • 每天10道Java面试题,跟我走,offer有!
  • 区块链分支循环
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 原生js练习题---第五课
  • HanLP分词命名实体提取详解
  • #pragam once 和 #ifndef 预编译头
  • (二)c52学习之旅-简单了解单片机
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转) ns2/nam与nam实现相关的文件
  • (转)大型网站的系统架构
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net FrameWork简介,数组,枚举
  • .Net FrameWork总结
  • .net 调用php,php 调用.net com组件 --
  • .NET下的多线程编程—1-线程机制概述
  • .php文件都打不开,打不开php文件怎么办
  • /usr/bin/env: node: No such file or directory
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • [20181219]script使用小技巧.txt
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++]Leetcode17电话号码的字母组合
  • [C++]四种方式求解最大子序列求和问题
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [IE技巧] 让IE 以全屏模式启动
  • [Java并发编程实战] 共享对象之可见性