原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,轉載請保留出處。
如果你是後端程式設計師,我想你一定見過*.tar.gz
、*.zip
、*.jar
字尾的檔案吧,這些都是壓縮檔案,那這些檔案都是怎麼生成的,又有哪些關鍵區別呢?本文將帶你一起了解這些檔案和配套的操作命令,以及其經常使用的場景。
Linux上最常見的壓縮檔案就是*.tar.gz
了,各種開源軟體常以這種格式釋出原始碼或程式,所以作為一名後端開發,還是很有必要了解一下的。
首先,可以發現這個檔案字尾名有兩段,即.tar
和.gz
,取這個名稱也是有原因的,因為它的製作過程就分為兩個部分,如下:
.tar
檔案# 將applogs目錄打包為applogs.tar檔案
# 其中-c代表打包、-f指定打包檔名
$ tar -cf applogs.tar applogs/
# 可以發現,打包檔案大小與目錄佔用大小差不多,因為tar僅僅是把目錄中檔案拼成單個檔案,預設並不壓縮
$ du -sh applogs/ applogs.tar
177M applogs/
175M applogs.tar
.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同樣是一種常見的壓縮檔案格式,字尾是*.zip
,與上面tar、gzip不同的是,zip將打包與壓縮兩個過程融合在一起了,在Linux下對應的操作命令是zip
與unzip
,如下:
# 建立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,壓縮檔案與命令介紹得差不多了,簡單總結一下:
*.tar.gz
檔案的命令,雖然它們是兩個命令,但幾乎都是一起使用的。*.zip
檔案的命令,值得注意的是,它們同樣可處理*.jar
檔案,且在搜尋場景中,使用zipgrep更方便。less命令其實可以直接開啟這些壓縮檔案,它甚至可以開啟png、pdf等廣義上的壓縮檔案!
另外,Linux平臺上其實還有一些其它的壓縮命令,如bzip2、xz、7z、rar等,就不一一介紹了,感興趣可檢視Linux man檔案。
密碼學入門
介面偶爾超時,竟又是JVM停頓的鍋!
耗時幾個月,終於找到了JVM停頓十幾秒的原因
mysql的timestamp會存在時區問題?
真正理解可重複讀事務隔離級別
字元編碼解惑