tar、gzip、zip、jar是什麼,怎麼檢視?

2022-09-17 18:00:55

原創:扣釘日記(微信公眾號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會存在時區問題?
真正理解可重複讀事務隔離級別
字元編碼解惑