https://www.cnblogs.com/codelogs/p/16702759.html
 

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

简介#

如果你是后端程序员,我想你一定见过*.tar.gz*.zip*.jar后缀的文件吧,这些都是压缩文件,那这些文件都是怎么生成的,又有哪些关键区别呢?本文将带你一起了解这些文件和配套的操作命令,以及其经常使用的场景。

tar与gzip#

Linux上最常见的压缩文件就是*.tar.gz了,各种开源软件常以这种格式发布源码或程序,所以作为一名后端开发,还是很有必要了解一下的。

首先,可以发现这个文件后缀名有两段,即.tar.gz,取这个名称也是有原因的,因为它的制作过程就分为两个部分,如下:

  1. 使用tar将目录打包成单个.tar文件
# 将applogs目录打包为applogs.tar文件
# 其中-c代表打包、-f指定打包文件名
$ tar -cf applogs.tar applogs/ # 可以发现,打包文件大小与目录占用大小差不多,因为tar仅仅是把目录中文件拼成单个文件,默认并不压缩
$ du -sh applogs/ applogs.tar
177M applogs/
175M applogs.tar
  1. 使用gzip将.tar文件压缩为.gz文件
# 使用gzip压缩,会生成applogs.tar.gz文件
$ gzip -k applogs.tar # 可以发现压缩后文件体积明显变小
$ du -sh applogs.tar applogs.tar.gz
175M applogs.tar
8.8M applogs.tar.gz

这就是*.tar.gz文件的制作过程,其实这两步使用tar命令可以简化为一步,如下:

# 打包并压缩,其中-z代表打包后再使用gzip压缩
$ tar -czf applogs.tar.gz applogs/ # 解压到当前目录
$ tar -xzf applogs.tar.gz -C ./

压缩日志文件
另外,由于日志文件内容一般都有很高重复率,这导致Linux上经常会将后端系统产生的历史日志文件压缩后存储起来,这样可以大幅减低磁盘空间占用。

基于这种情况,Linux上又诞生了一批查看压缩日志文件的命令,如zcat、zgrep、zless等,如下:

# 自动解压文件,并将其中文件内容输出
$ zcat applogs.tar.gz # 自动解压文件,并在其中搜索,用法和grep类似
$ zgrep -a 'error' applogs.tar.gz

这比傻乎乎地先解压文件,再在文件中搜索要高效多了。

tar与其它压缩算法
另外,除了gzip外,tar其实也可以搭配其它压缩算法,像bzip2、xz等等,如下:

  -j, --bzip2                filter the archive through bzip2
-J, --xz filter the archive through xz
--lzip filter the archive through lzip
--lzma filter the archive through xz
--lzop filter the archive through lzop
-z, --gzip, --gunzip, --ungzip filter the archive through gzip
--zstd filter the archive through zstd
-Z, --compress, --uncompress filter the archive through compress

zip与jar#

zip同样是一种常见的压缩文件格式,后缀是*.zip,与上面tar、gzip不同的是,zip将打包与压缩两个过程融合在一起了,在Linux下对应的操作命令是zipunzip,如下:

# 创建zip压缩文件
$ zip -r applogs.zip applogs/ # 查看zip压缩文件中有哪些文件
$ unzip -l applogs.zip
Archive: applogs.zip
Length Date Time Name
--------- ---------- ----- ----
0 2022-09-17 12:58 applogs/
99166 2022-09-16 18:20 applogs/demo.2022-09-16.0.log
13177092 2022-09-17 13:37 applogs/demo.2022-09-17.0.log
948 2022-08-09 15:08 applogs/demo.log
...
--------- -------
203039002 140 files # 解压zip文件,-d指定解压目录
$ unzip applogs.zip -d ./

与gzip类似的是,zip也配套了一批方便特定场景使用的命令工具,如zipinfo、zipgrep等,如下:

# zipinfo查看zip文件包含哪些文件
$ zipinfo applogs.zip
Archive: applogs.zip
Zip file size: 9573195 bytes, number of entries: 140
drwxrwxrwx 3.0 unx 0 bx stor 22-Sep-17 12:58 applogs/
-rwxrwxrwx 3.0 unx 99166 tx defN 22-Sep-16 18:20 applogs/demo.2022-09-16.0.log
-rwxrwxrwx 3.0 unx 13177092 tx defN 22-Sep-17 13:37 applogs/demo.2022-09-17.0.log
-rwxrwxrwx 3.0 unx 948 tx defN 22-Aug-09 15:08 applogs/demo.log
...
140 files, 203039002 bytes uncompressed, 9546235 bytes compressed: 95.3% # zipgrep自动解压文件,并在其中搜索,用法和grep类似
$ zipgrep 'error' applogs.zip

查看jar文件
目前,绝大多数java项目都是基于spingboot的,众所周知,spingboot会将项目打包成单个jar文件来部署,但其实jar文件本质上就是zip格式,它相比zip文件只是多了一个META-INF/MANIFEST.MF文件而已,如下:

$ unzip -p app.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.4.0
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

如上所示,MANIFEST.MF文件指定了jar包的Main-Class,这样当执行java -jar app.jar时,java就知道去哪个类找main方法了,而spingboot打包的jar,无非就是将启动类换成了自己的而已。

而很多时候,我们需要确认下jar文件里面的内容,比如我想看一下app.jar里被spingboot内嵌的tomcat的线程池配置大小,可如下查看:

$ zipgrep 'max-thread' app.jar
BOOT-INF/classes/application.yml: max-threads: 500

这可比jdk自带的jar命令方便多了,如果你是java开发同学,这个命令应该成为你开发工具箱中的一员。

总结#

ok,压缩文件与命令介绍得差不多了,简单总结一下:

  1. tar、gzip:用于打包或解压*.tar.gz文件的命令,虽然它们是两个命令,但几乎都是一起使用的。
  2. zip、unzip:用于打包或解压*.zip文件的命令,值得注意的是,它们同样可处理*.jar文件,且在搜索场景中,使用zipgrep更方便。

less命令其实可以直接打开这些压缩文件,它甚至可以打开png、pdf等广义上的压缩文件!

另外,Linux平台上其实还有一些其它的压缩命令,如bzip2、xz、7z、rar等,就不一一介绍了,感兴趣可查看Linux man文档。

往期内容#

密码学入门
接口偶尔超时,竟又是JVM停顿的锅!
耗时几个月,终于找到了JVM停顿十几秒的原因
mysql的timestamp会存在时区问题?
真正理解可重复读事务隔离级别
字符编码解惑

[转帖]tar、gzip、zip、jar是什么,怎么查看?的更多相关文章

  1. tar/gzip/zip文件打包、压缩命令

    一.tar打包备份工具 1.命令功能 tar 将多个文件或目录打包在一起,可用通过调用gzip或zip实现压缩.解压的命令:tar不仅可以多多个文件进行打包,还可以对多个文件打包后进行压缩. 2.语法 ...

  2. [转帖]Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

    Linux操作系统中,*.zip.*.tar.*.tar.gz.*.tar.bz2.*.tar.xz.*.jar.*.7z等格式的压缩与解压 https://blog.csdn.net/gatieme ...

  3. Linux下解压命令大全 解压缩 tar bz2 zip tar.gz gz

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)---------------.gz解压1:gunz ...

  4. atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php

    atitit.压缩算法 ZLib ,gzip ,zip   最佳实践  java .net php 1. 压缩算法的归类::: 纯算法,带归档算法 1 2. zlib(适合字符串压缩) 1 3. gz ...

  5. AIX上解压缩.tar.Z, .tar.gz, .zip及.tgz

    在AIX上最常见的压缩文件就是.tar檔了,而除了tar文件以外,有时会遇到数据是用其它的压缩文件格式,所以偶顺手整理了一些常见的压缩文件格式,在AIX要怎么解压缩 : ·    .tar.Z fil ...

  6. golang tar gzip 压缩,解压(含目录文件)

    tar是用于文件归档,gzip用于压缩.仅仅用tar的话,达不到压缩的目的.我们常见的tar.gz就是用gzip压缩生成的tar归档文件. go实现tar压缩与解压与zip类似,区别在于tar需要使用 ...

  7. gz、tar、zip、bz2压缩和解压缩命令

    gzip 压缩后的格式为:*.gz 这种压缩方式不能保存原文件:且不能压缩目录 命令举例:#压缩[root@localhost tmp]# gzip buodo[root@localhost tmp] ...

  8. Android总结之Gzip/Zip压缩

    前言: 做过Android网络开发的都知道,在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方 ...

  9. Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

    zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...

  10. Linux操作系统中,.zip、.tar、.tar.gz、.tar.bz2、.tar.xz、.jar、.7z等格式的压缩与解压

    zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...

随机推荐

  1. 3步带你搞定华为云编译构建CodeArts Build “新手村任务”

    华为云编译构建(CodeArts Build)基于云端大规模并发加速,为客户提供高速.低成本.配置简单的混合语言构建能力,帮助客户缩短构建时间,提升构建效率. 本文将给各位开发者带来华为云CodeAr ...

  2. 华为云GaussDB圈层活动走进香港,以技术创新构筑金融政企数智发展基石

    摘要:近日,华为云GaussDB圈层活动在中国·香港如期举办,活动聚集了22家香港金融政企客户和合作伙伴. 本文分享自华为云社区<华为云GaussDB圈层活动走进香港,赋能金融政企数字化转型&g ...

  3. 论文复现丨基于ModelArts实现Text2SQL

    摘要:该论文提出了一种基于预训练 BERT 的新神经网络架构,称为 M-SQL.基于列的值提取分为值提取和值列匹配两个模块. 本文分享自华为云社区<基于ModelArts实现Text2SQL&g ...

  4. “互联网+”大赛之AI创新应用赛题攻略:大胆脑洞,共绘智慧生活蓝图

    摘要:本次"互联网+"大赛AI创新应用赛题的设置是希望学生可以从日常实际应用需求出发,结合自己的奇思妙想,提升智能终端用户的使用体验,为构建万物互联的智能世界贡献一份力量. 本文分 ...

  5. 【python爬虫】requests高级用法 代理池搭建 爬虫实战

    目录 昨日回顾 面试题 爬虫总结 今日内容 1 requests高级用法 1.0 解析json 1.1 ssl认证(了解) 1.2 使用代理(重要) 1.3 超时设置 1.4 异常处理 1.5 上传文 ...

  6. Android 编译线程爆了, gradle 内存 OOM 解决之路

    本文首发我的微信公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力 ...

  7. leaflet 绘制 点 线 面 圆 椭圆 线缓冲区

    leaflet有个绘图插件Leaflet.draw,但是我不想要它的控件,只想用它的绘制功能,控件我自己提供,当时不知道如何使用,就自己写了个绘制点线面圆和椭圆的工具,代码如下: /// <re ...

  8. acwing算法提高课程笔记—数字三角形模型,最长上升子序列模型

    转自自网络,仅作为学习使用 1015摘花生 /*Hello Kitty想摘点花生送给她喜欢的米老鼠. 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来. 地里每个道路的交叉点上都 ...

  9. 供应链安全情报 | 恶意py包伪装代理SDK进行后门攻击,目标锁定python开发者

    概述 2023年11月28号,悬镜供应链安全实验室在Pypi官方仓库(https://pypi.org)监测到两起伪装成http和socks5代理SDK的开源组件投毒事件.python开发者一旦下载安 ...

  10. 分享一个在线二维码生成器(基于qrcode.js开发)

    一种二维码扫描与生成的工具, 它可生成个性化二维码, 支持文本.网址.图片.短信.电话等格式及主题,提供融合码功能 演示地址 https://qrcode.gitapp.cn 关键代码 var qrc ...