如何在 Linux 上使用 Gzip 壓縮和解壓縮文件

已發表: 2022-06-28
紅色背景上的 Linux 終端。
fatmawati achmad zaenuri/Shutterstock.com

有許多文件壓縮實用程序,但可以保證在每個 Linux 發行版上都能找到gzip 。 如果你只學習使用一種壓縮工具,那應該是gzip

相關:文件壓縮如何工作?

算法和樹

gzip數據壓縮工具是在 1990 年代初編寫的,它仍然存在於每個 Linux 發行版中。 還有其他可用的壓縮工具,但無論您發現自己需要在哪台 Linux 計算機上工作,都可以在上面找到gzip 。 因此,如果您知道如何使用gzip ,那麼您無需安裝任何東西就可以使用。

gzip是 DEFLATE 算法的實現,該算法由 PKZIP 的 Phil Katz 發明並獲得專利。 DEFLATE 算法改進了早期的壓縮算法,這些算法都對主題的變化進行操作。 掃描要壓縮的數據,識別唯一字符串並將其添加到二叉樹中。

唯一的字符串根據它們在樹中的位置被分配一個唯一的 ID 標記。 標記用於替換數據中的字符串,並且由於標記小於它們替換的數據,因此文件被壓縮。 將標記替換為原始字符串會將數據重新膨脹回其未壓縮狀態。

基準測試:最好的文件壓縮格式是什麼?
相關基準:最好的文件壓縮格式是什麼?

DEFLATE 算法增加了一個扭曲,即最常遇到的字符串被分配最小的標記,而最不經常遇到的字符串被分配更大的標記。 DEFLATE 算法還結合了兩種早期壓縮方法的思想,即霍夫曼編碼和 LZ77 壓縮。

在撰寫本文時,DEFLATE 算法已有近三個十年的歷史。 三十年前,數據存儲成本高,傳輸速度慢。 數據壓縮至關重要。

在 Linux 上釋放磁盤空間的 4 種方法
相關4 種在 Linux 上釋放磁盤空間的方法

今天的數據存儲要便宜得多,傳輸速度要快幾個數量級。 但是我們有更多的數據要存儲,全世界的人們都在訪問云存儲和流媒體服務。 數據壓縮仍然至關重要,即使您所做的只是縮小需要上傳或傳輸的內容,或者您​​正試圖收回本地硬盤驅動器上的一些空間。

gzip 命令

文件越大,壓縮效果越好。 這是因為兩個原因。 一是在一個大文件中會有許多重複的、相同的字節序列。 第二個原因是字符串和標記的列表需要存儲在壓縮文件中,以便可以進行解壓縮。 對於一個非常小的文件,開銷可以消除壓縮的好處。 但即使文件相當小,大小也可能會有所減少。

壓縮文件

要壓縮文件,您只需將文件名傳遞給gzip命令即可。 我們將檢查文件的原始大小,對其進行壓縮,然後檢查壓縮文件的大小。

 ls -lh calc-sheet.ods
 gzip calc-sheet.ods
 ls -lh 校準 -* 

壓縮電子表格

原始文件(名為“calc-sheet.ods”的電子表格)為 11 KB,壓縮文件(也稱為存檔文件)為 9.3 KB。 請注意,存檔文件的名稱是原始文件的名稱,並附加了“.gz”。

ls命令的第一次使用針對特定文件,即電子表格。 ls的第二次使用查找所有以“calc-”開頭的文件,但它只查找壓縮文件。 這是因為,默認情況下, gzip會創建存檔文件並刪除原始文件。

那不是問題。 如果您需要原始文件,您可以從存檔文件中檢索它。 但如果您更喜歡保留原始文件,可以使用-k (保留)選項。

 gzip -k calc-sheet.ods
 ls -lh 計算表。* 

壓縮文件並保留原始文件

這次保留了原始 ODS 文件。

解壓文件

要解壓縮 GZ 存檔文件,請使用-d (解壓縮)選項。 這將從存檔中提取壓縮文件並解壓縮,使其與原始文件無法區分。

 ls 計算表。*
 gzip -d 計算表.ods.gz
 ls 計算表。* 

使用 gzip 解壓文件

這一次,我們可以看到gzip在解壓原文件後已經刪除了歸檔文件。 要保留存檔文件,我們需要再次使用-k (保留)選項以及-d (解壓縮)選項。

 ls 計算表。*
 gzip -d 計算表.ods.gz
 ls 計算表。* 

解壓文件並保留存檔文件

這一次,gzip 不會刪除存檔文件。

相關:為什麼可以恢復已刪除的文件,以及如何防止它

解壓和覆蓋

如果您嘗試在存在原始文件(或具有相同文件的不同文件)的目錄中提取文件, gzip將提示您選擇放棄提取或覆蓋現有文件。

 gzip -d 文本文件.txt.gz 

當歸檔文件中的文件已存在於目錄中時,來自 gzip 的覆蓋提示

如果您事先知道您很高興目錄中的文件被存檔中的文件覆蓋,請使用 -f(強制)選項。

 gzip -df 文本文件.txt.gz 

強制覆蓋現有文件

該文件被覆蓋,您將靜默返回到命令行。

壓縮目錄樹

-r (遞歸)選項使gzip壓縮整個目錄樹中的文件。 但結果可能不是你所期望的。

這是我們將在此示例中使用的目錄樹。 每個目錄都包含一個文本文件。

 樹級別1 

測試目錄樹結構

讓我們在目錄樹上使用gzip看看會發生什麼。

 gzip -r level1/
 樹級別1 

運行 gzip 後的目錄結構

結果是gzip為目錄結構中的每個文本文件創建了一個存檔文件。 它沒有創建整個目錄樹的存檔。 實際上, gzip只能將單個文件放入存檔中。

我們可以創建一個包含目錄樹及其所有文件的存檔文件,但我們需要使用另一個命令。 tar程序用於創建許多文件的存檔,但它沒有自己的壓縮例程。 但是通過tar使用適當的選項,我們可以使tar通過gzip推送存檔文件。 這樣我們就得到了一個壓縮的存檔文件和一個多文件或多目錄的存檔。

 tar -czvf level1.tar.gz level1

tar選項是:

  • c :創建檔案。
  • z :通過gzip推送文件。
  • v :詳細模式。 在終端窗口中打印tar在做什麼。
  • f level1.tar.gz :用於歸檔文件的文件名。

tar 的輸出通過目錄樹工作

這會歸檔目錄樹結構和目錄樹中的所有文件。

相關:如何在 Linux 上使用 tar 命令壓縮和提取文件

獲取有關檔案的信息

-l (列表)選項提供有關存檔文件的一些信息。 它向您顯示存檔中文件的壓縮和未壓縮大小、壓縮率和文件名。

 gzip -l 級別1.tar.gz
 gzip -l 文本文件.txt.gz 

使用 -l list 選項查看存檔的壓縮統計信息

您可以使用-t (測試)選項檢查存檔文件的完整性。

 gzip -t level1.tar.gz 

使用 -t 選項測試存檔

如果一切順利,您將靜默返回命令行。 沒有消息就是好消息。

如果存檔損壞或不是存檔,您會被告知。

 gzip -t not-an-archive.gz 

使用 -t 選項測試不是存檔的文件

速度與壓縮

您可以選擇優先考慮存檔的創建速度或壓縮程度。 為此,您可以提供一個數字作為選項,從-1到 top -9-1選項以犧牲壓縮為代價提供最快的速度, -9以犧牲速度為代價提供最高的壓縮。

除非您提供這些選項之一,否則 gzip 使用-6

 gzip -1 計算表.ods
 ls -lh 計算表.ods.gz
 gzip -9 計算表.ods
 ls -lh 計算表.ods.gz
 gzip -6 計算表.ods
 ls -lh 計算表.ods.gz 

使用具有不同優先級的 gzip 來提高速度和壓縮率

對於這麼小的文件,我們沒有看到執行速度有任何顯著差異,但壓縮有很小的差異。

有趣的是,使用 9 級壓縮和 6 級壓縮沒有區別。 您只能對任何給定文件進行如此多的壓縮,在這種情況下,使用 6 級壓縮已達到該限制。 將其提升到 9 不會進一步減小文件大小。 對於更大的文件,6 級和 9 級之間的差異會更加明顯。

已壓縮,未受保護

不要將壓縮誤認為是加密或任何形式的保護。 壓縮文件不會給它任何安全性或增強的隱私性。 任何有權訪問您的文件的人都可以使用gzip對其進行解壓縮。

相關:列出 Linux 上 10 個最大的文件或目錄