gzip:Linux 檔案壓縮與 gzip 解壓縮、gunzip 和 zcat 用法
gzip 是在 Linux 上把一個檔案壓縮成 .gz 檔的指令,解壓縮時在同一個指令加上 -d,或改用 gunzip。在 AlmaLinux 9 伺服器上壓縮 31,878 位元組的存取記錄後縮小到 4,424 位元組,解壓縮後原本的大小和修改時間都原樣恢復。
以下輸出是在 AlmaLinux 9.8 伺服器上以 root 帳號於測試資料夾執行的結果,時間以 UTC 為準。存取記錄、備忘和設定檔都是為測試建立的範例檔案,記錄中出現的 IP 位址也是文件用的範例值。
1️⃣ gzip 指令用法
測試資料夾裡有兩個存取記錄、兩個備忘檔、放有設定檔的 config 資料夾,以及空的 restore 資料夾。
ls -ltotal 88
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log
-rw-r--r-- 1 root root 47748 Oct 27 23:59 access.log-20261027
drwxr-xr-x 2 root root 39 Oct 29 00:19 config
-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
drwxr-xr-x 2 root root 6 Oct 29 00:19 restore在 gzip 後面寫上檔名,該檔案就會變成名稱結尾加上 .gz 的壓縮檔。下面這個壓縮 access.log 的指令執行完不會另外輸出任何內容。
gzip access.log壓縮後用 ls -l 查看,access.log 不見了,只剩下 access.log.gz。原本 31,878 位元組的記錄變成 4,424 位元組,修改時間仍是原檔的時間。
ls -l access.log access.log.gzls: cannot access 'access.log': No such file or directory
-rw-r--r-- 1 root root 4424 Oct 28 23:50 access.log.gz加上 -v 會顯示每個檔案縮小的比例和新的檔名。readme.txt 那一行的 [81.5%] 是比原本大小縮小的比例,[replaced with] 表示原檔已被 .gz 檔取代。
gzip -v readme.txtreadme.txt: 81.5% -- replaced with readme.txt.gz要保留原檔就加上 -k。用 -k 壓縮 memo.txt 後,memo.txt 和 memo.txt.gz 會並排留下。
gzip -k memo.txtls -l memo.txt memo.txt.gz-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz45 位元組的 memo.txt 壓縮後反而變大成 71 位元組。依官方手冊,gzip 即使結果比原檔大也會照樣壓縮,並把原檔名和時間一起存進壓縮檔裡。
一次寫上多個檔案時,每個檔案會各自產生一個 .gz 檔。壓縮 config 資料夾裡的兩個設定檔,會得到 app.conf.gz 和 site.conf.gz 兩個檔案。
gzip -v config/app.conf config/site.confconfig/app.conf: 78.7% -- replaced with config/app.conf.gz
config/site.conf: 87.7% -- replaced with config/site.conf.gzls -l config/total 8
-rw-r--r-- 1 root root 206 Oct 20 11:00 app.conf.gz
-rw-r--r-- 1 root root 93 Oct 20 11:05 site.conf.gz2️⃣ gzip 解壓縮
用 -d 解壓縮 access.log.gz 時不會有輸出,access.log 重新出現,access.log.gz 不會留下。
gzip -d access.log.gzls -l access.log access.log.gzls: cannot access 'access.log.gz': No such file or directory
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log恢復的 access.log 大小為 31,878 位元組,修改時間也和壓縮前一樣是 Oct 28 23:50。
gunzip 是和 gzip -d 做同樣事情的指令。一起加上 -k 會在保留壓縮檔的情況下解壓縮,-v 那一行的 [created] 表示沒有刪除 .gz 檔而建立了新檔案。
gunzip -kv readme.txt.gzreadme.txt.gz: 81.5% -- created readme.txtls -l readme.txt readme.txt.gz-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
-rw-r--r-- 1 root root 108 Oct 27 09:10 readme.txt.gzgzip 沒有指定解壓縮資料夾的選項,要解壓縮到其他資料夾時,用 -c 把解壓縮的內容送到標準輸出,再在 [>] 後面寫上新檔案的路徑。下面是把 memo.txt.gz 解壓縮成 restore 資料夾中 memo.txt 的指令。
gzip -dc memo.txt.gz > restore/memo.txtls -l restore/total 4
-rw-r--r-- 1 root root 45 Oct 29 00:19 memo.txt用 -c 解壓縮時 memo.txt.gz 會原樣留下。新建立的 restore/memo.txt 修改時間是建立檔案時的 Oct 29 00:19。
3️⃣ gzip 指令選項
-l 不解壓縮,就用一行輸出壓縮後大小、原本大小、縮小比例和解壓縮後的名稱。用 -k 重新壓縮 access.log 後以 -l 確認,結果如下。
gzip -k access.loggzip -l access.log.gz compressed uncompressed ratio uncompressed_name
4424 31878 86.2% access.log一起加上 -v 時,前面會再加上壓縮方式(deflate 縮寫的 defla)、原始資料的 CRC,以及原檔的日期和時間。
gzip -lv access.log.gzmethod crc date time compressed uncompressed ratio uncompressed_name
defla b49b41c4 Oct 28 23:50 4424 31878 86.2% access.log-t 只檢查壓縮檔有沒有損壞就結束。和 -v 一起使用時,沒有問題的檔案後面會出現 [OK]。
gzip -tv access.log.gzaccess.log.gz: OK-1 到 -9 的數字是壓縮等級,依官方手冊預設值是 -6。我們用 -c 把同一個 access.log 壓縮三次,再用 wc -c 比較大小。
gzip -c -1 access.log | wc -c5564gzip -c -6 access.log | wc -c4424gzip -c -9 access.log | wc -c4164| 壓縮等級 | .gz 大小 | 相對原本大小 |
|---|---|---|
| 原檔(access.log) | 31,878 位元組 | 100% |
| -1 (最快) | 5,564 位元組 | 17.5% |
| -6 (預設值) | 4,424 位元組 | 13.9% |
| -9 (最小) | 4,164 位元組 | 13.1% |
-9 比預設值小 260 位元組,-1 比預設值大 1,140 位元組。
只寫資料夾名稱時會出現 [is a directory -- ignored],資料夾會直接被略過。
gunzip configgzip: config is a directory -- ignored要處理資料夾裡的所有檔案時加上 -r。用 gunzip -r 解壓縮已壓縮兩個設定檔的 config 資料夾,兩個檔案會依序解壓縮。
gunzip -rv configconfig/app.conf.gz: 78.7% -- replaced with config/app.conf
config/site.conf.gz: 87.7% -- replaced with config/site.confls -l config/total 8
-rw-r--r-- 1 root root 840 Oct 20 11:00 app.conf
-rw-r--r-- 1 root root 528 Oct 20 11:05 site.conf-r 會把資料夾裡的檔案逐一分別壓縮或解壓縮,不會把多個檔案合成一個。要把整個資料夾做成一個壓縮檔時,請用 tar 指令一邊打包一邊壓縮。用 tar -czf 壓縮 config 資料夾,資料夾和兩個檔案都會放進一個 config.tar.gz。
tar -czf config.tar.gz configtar -tzvf config.tar.gzdrwxr-xr-x root/root 0 2026-10-29 00:19 config/
-rw-r--r-- root/root 840 2026-10-20 11:00 config/app.conf
-rw-r--r-- root/root 528 2026-10-20 11:05 config/site.conf📌 主要選項:本文實際執行的結果
| 選項 | 作用 | 本文看到的結果 | |
|---|---|---|---|
| -c | 把結果送到標準輸出,原檔保持不動 | 把 -dc 的輸出導向 restore/memo.txt 後產生 45 位元組的 memo.txt | |
| -d | 解壓縮(和 gunzip 相同) | access.log.gz 消失,31878 位元組的 access.log 重新出現 | |
| -k | 壓縮或解壓縮後仍保留原檔 | memo.txt(45 位元組)和 memo.txt.gz(71 位元組)並排留下 | |
| -v | 輸出每個檔案縮小的比例和新的檔名 | readme.txt: 81.5% -- replaced with readme.txt.gz | |
| -l | 以清單輸出壓縮檔的大小、比例和解壓縮後的名稱 | 壓縮後大小 4424、原本大小 31878、比例 86.2%、名稱 access.log | |
| -t | 檢查壓縮檔有沒有損壞 | 用 -tv 得到 access.log.gz: OK,尾端被截斷的 broken.gz 則是 unexpected end of file | |
| -r | 壓縮或解壓縮資料夾裡的所有檔案 | 一次 gunzip -rv config 就解壓縮了 config/app.conf.gz 和 config/site.conf.gz | |
| -f | 即使有同名檔案也不詢問直接覆寫 | 沒有詢問就覆寫,memo.txt 不見了,只剩 memo.txt.gz(71 位元組) | |
| -1 ~ -9 | 壓縮等級(-1 最快、-9 最小、預設值 -6) | 用 wc -c 計算以 -1、-6、-9 壓縮的輸出,得到 5564、4424、4164 |
📎 其他選項:依官方手冊
| 選項 | 作用 | |
|---|---|---|
| -N | 壓縮時儲存原檔名和時間(壓縮預設值),解壓縮時用儲存的名稱和時間還原 | |
| -n | 壓縮時不儲存原檔名和時間,解壓縮時使用只去掉 .gz 的名稱(解壓縮預設值) | |
| -q | 不輸出任何警告 | |
| -S 後綴 | 以指定的後綴取代 .gz 進行壓縮,解壓縮時先找該後綴 | |
| --rsyncable | 壓縮成用 rsync 和其他伺服器同步壓縮檔時只傳送變更部分的形式 |
🔲 gzip 指令模擬器
在下方的模擬器中,可以親自輸入指令,試試用 gzip 壓縮、解壓縮,以及用 zcat 和 zgrep 查看內容的過程。
4️⃣ 查看 gzip 檔案內容
加上日期保存的舊記錄,用 gzip 壓縮後可以減少佔用的空間。下面是壓縮前一天記錄 access.log-20261027 的指令。
gzip access.log-20261027壓縮的記錄不用解壓縮,就能用 zcat 把內容輸出到畫面上。zcat 和 gunzip -c 是相同的指令(依官方手冊),所以 .gz 檔會原樣留下。
zcat access.log-20261027.gz | head -3192.0.2.50 - - [27/Oct/2026:00:00:00 +0000] GET / HTTP/1.1 200 15929
192.0.2.54 - - [27/Oct/2026:00:00:07 +0000] GET / HTTP/1.1 200 17699
192.0.2.4 - - [27/Oct/2026:00:00:14 +0000] GET / HTTP/1.1 200 13813zcat 的輸出可以用管線交給其他指令,用 wc -l 計算可知這個記錄有 600 行。
zcat access.log-20261027.gz | wc -l600要在壓縮的記錄中搜尋特定文字時使用 zgrep。加上 -c 只會顯示含有 [ 404 ] 的行數,要看行的內容就不加 -c 執行。
zgrep -c ' 404 ' access.log-20261027.gz37zgrep ' 404 ' access.log-20261027.gz | head -3192.0.2.23 - - [27/Oct/2026:00:02:06 +0000] GET /old-page-6/ HTTP/1.1 404 229
192.0.2.38 - - [27/Oct/2026:00:04:40 +0000] GET /old-page-2/ HTTP/1.1 404 217
192.0.2.22 - - [27/Oct/2026:00:07:42 +0000] GET /old-page-6/ HTTP/1.1 404 414zcat 收到沒有壓縮的檔案時,會輸出 [not in gzip format] 並停止。
zcat access.log | head -1
gzip: access.log: not in gzip formatzgrep 也能直接讀取沒有壓縮的檔案,所以可以一次搜尋現在使用中的記錄和已壓縮的舊記錄。寫上兩個以上的檔案時,行數前面會加上檔名。
zgrep -c wp-login.php access.log access.log-20261027.gzaccess.log:36
access.log-20261027.gz:525️⃣ gzip 錯誤
再次壓縮已經以 .gz 結尾的檔案時,會出現 [already has .gz suffix -- unchanged],檔案保持原樣。
gzip access.log.gzgzip: access.log.gz already has .gz suffix -- unchanged反過來,用 -d 解壓縮不是以 .gz 結尾的檔案時,會出現 [unknown suffix -- ignored]。
gzip -d memo.txtgzip: memo.txt: unknown suffix -- ignored只有名稱是 .gz、但不是用 gzip 壓縮的檔案,會以 [not in gzip format] 結束。把文字檔 memo.txt 複製成 notgzip.gz 這個名稱再解壓縮時,就出現了這段訊息。
cp memo.txt notgzip.gzgzip -d notgzip.gz
gzip: notgzip.gz: not in gzip format下載中斷導致尾端缺失的 .gz 檔,會以 [unexpected end of file] 結束。這是用 -t 檢查只留下已壓縮舊記錄前 2,000 位元組的 broken.gz 所得到的結果。
head -c 2000 access.log-20261027.gz > broken.gzgzip -t broken.gz
gzip: broken.gz: unexpected end of file即使是被截斷的檔案,用 zcat 解壓縮也能取出截斷處之前的內容。600 行的記錄中有 162 行留在 restore/broken.log,官方手冊也建議用 zcat 救回損壞壓縮檔的前段。
zcat broken.gz > restore/broken.logwc -l restore/broken.log
gzip: broken.gz: unexpected end of file
162 restore/broken.log如果已經有和要建立的 .gz 檔同名的檔案,gzip 會詢問是否覆寫。輸入 n 就會顯示 [not overwritten] 並在不做任何變更的情況下結束。
gzip memo.txtgzip: memo.txt.gz already exists; do you wish to overwrite (y or n)? n
not overwritten加上 -f 就會不詢問直接覆寫。因為沒有加 -k,memo.txt 會消失,只剩下 memo.txt.gz。
gzip -f memo.txtls -l memo.txt memo.txt.gzls: cannot access 'memo.txt': No such file or directory
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz處理壓縮時出現的錯誤訊息和接下來要確認的事項如下。
| 輸出 | 說明 | 接下來要確認的項目 |
|---|---|---|
| already has .gz suffix -- unchanged | 檔案已經以 .gz 結尾,所以不再壓縮 | 是否寫上要壓縮的原檔名稱 |
| unknown suffix -- ignored | 試圖解壓縮不是以 .gz 結尾的檔案 | 用 ls 確認 .gz 檔名 |
| not in gzip format | 名稱是 .gz,但不是用 gzip 壓縮的檔案 | 實際格式(zip、tar)和對應的指令 |
| unexpected end of file | 壓縮檔的尾端被截斷 | 和原檔比較大小後重新下載;用 zcat 救回前段 |
| already exists; do you wish to overwrite | 已經有和要建立的檔案同名的檔案 | 可以覆寫就用 y 或 -f;要保留就用 -c 存成其他名稱 |
| is a directory -- ignored | 寫的是資料夾名稱而不是檔案 | 資料夾裡的檔案用 -r;要合成一個就用 tar |
🔢 FAQ & 推薦內容
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。