在 Linux 上處理 Zip 檔案

Niraj Menon 2023年1月30日 2022年5月11日
  1. 在 Linux 中使用 ZIP 進行簡單壓縮
  2. 在 Linux 中使用多檔案壓縮
  3. 在 Linux 中新增資料夾目錄
  4. 在 Linux 中提取 Zipfile
  5. 在 Linux 中更新或更新 ZIP 檔案中的檔案
  6. 在 Linux 中建立跨區 ZIP 檔案
在 Linux 上處理 Zip 檔案

壓縮檔案或 zipfiles 對於外行來說非常常見,是一種將多個檔案和目錄組合並壓縮成單個檔案的好方法。

ZIP 格式自 1989 年以來就已經存在,並且至少從 2000 年代起就已得到現代作業系統的支援。

如果你編寫指令碼來操作 ZIP 檔案或希望更頻繁地使用命令列,你可能會發現這很有幫助。

本教程將向普通 Linux 使用者介紹 ZIP 檔案的建立、更新、合併和拆分以及提取,所有這些都在 Bash shell 命令列上進行。

在 Linux 中使用 ZIP 進行簡單壓縮

zipfile 的最初目的是壓縮。簡而言之,需要一個或多個檔案/目錄。

它結合了每個檔案中的常見模式,並使用特殊的編碼來刪除冗餘資訊,從而可以無損地重建每個檔案中的資料。

你可以閱讀完整的規範這裡

這很好地展示了這種壓縮的效果以及如何建立 zip 檔案。

建立包含相同資訊的具有相似字元的檔案,例如 Lorem Ipsum。然後使用 zip 命令將它們放入一個 zip 檔案中。

# we assume a file named lorem.txt exists 
# that is at least 15 MB large - you can 
# use any online site to make such a file!

user@linux:~$ ls -lh lorem.txt
-rw-r--r-- 1 user user 15M Jan  1 00:00 lorem.txt

user@linux:~$ zip lorem.zip lorem.txt
  adding: lorem.txt (deflated 89%)

user@linux:~$ ls -lh lorem
-rw-r--r-- 1 user user  15M Jan  1 00:00 lorem.txt
-rw-r--r-- 1 user user 1.6M Jan  1 00:00 lorem.zip

lorem.txt 檔案包含 26 個可能的英文字母、逗號、句號、空格和換行符。對於總共 30 個唯一字元,僅包含這種字元組合的大檔案非常容易壓縮。

ZIP 的編碼有效地儲存了唯一字元的數量,記錄了它們出現的次數和距離的遠近。比原始檔案儲存更小,並允許在從 zipfile 中提取檔案時進行完全重建。

在 Linux 中使用多檔案壓縮

語法很簡單,可以壓縮多個沒有目錄的檔案。

# assume we have three files - lorem1, lorem2, lorem3.
user@linux:~$ zip lorem.zip lorem*
  adding: lorem1.txt (deflated 48%)
  adding: lorem2.txt (deflated 50%)
  adding: lorem3.txt (deflated 49%)
user@linux:~$ ls -lh lorem*
-rw-r--r-- 1 user user  832 Jan  1 00:00 lorem1.txt
-rw-r--r-- 1 user user  862 Jan  1 00:00 lorem2.txt
-rw-r--r-- 1 user user  919 Jan  1 00:00 lorem3.txt
-rw-r--r-- 1 user user 1.8K Jan  1 00:00 lorem.zip

在 Linux 中新增資料夾目錄

要將資料夾新增到 zipfile,請指定遞迴 -r 選項並在 zip 檔案路徑後指定資料夾名稱,如下所示。

# assuming a folder named loremfiles exists
user@linux:~$ zip -r lorem.zip loremfiles/

在 Linux 中提取 Zipfile

zip 實用程式不包括提取功能。相反,這將由 unzip 處理。其語法非常簡單。

unzip lorem.zip

在 Linux 中更新或更新 ZIP 檔案中的檔案

在包含它的 zipfile 中對你想要相應更新的檔案進行更改。你可以使用更新的 -f 標誌使 zip 在 zipfile 中查詢原始檔案。

檢查它們是否在 zipfile 被修改後發生了變化,並新增現有檔案的較新版本。

例如,在前面的示例中,如果我們修改 lorem1.txt 並執行以下命令,我們可以更新我們的 lorem zip 檔案並進行更改。

user@linux:~$ zip -f lorem.zip
freshening: lorem1.txt (deflated 48%)

我們可以使用更新 -u 選項來獲得更多功能。

除了使用較新的檔案更新 zipfile 之外,它還可以將新檔案新增到現有的 zipfile 並在 zipfile 不存在時建立它。

# we change lorem3.txt, and create lorem4 and lorem5
user@linux:~$ zip -u lorem.zip lorem*
updating: lorem3.txt (deflated 49%)
  adding: lorem4.txt (deflated 49%)
  adding: lorem5.txt (deflated 49%)

在 Linux 中建立跨區 ZIP 檔案

我們可能會避免通過 Internet 傳送一個巨大的檔案以節省頻寬。相反,傳送多個檔案,以便在其他檔案失敗時至少部分檔案可以通過。

我們可以嘗試重新傳送它們。ZIP 提供了將一個非常大的 zip 檔案拆分為多個部分的選項,稱為跨區存檔。

要嘗試一個示例,請查詢一個大檔案或使用隨機資料建立一個檔案,如下所示。

dd if=/dev/urandom of=frnd count=16384 bs=1024

這會在本地目錄中生成一個名為 frnd 的 16 MB 檔案。然後我們使用如圖所示的 zip 命令將其拆分為 2 部分的 zip 檔案,每部分 8 MB。

zip -r -s 8m rnd.zip frnd

這將生成兩個名為 rnd.z01rnd.z02 的 8 MB 檔案以及一個名為 rnd.zip 的檔案結尾 zip。最後一個是必要的,以指示解壓縮已達到檔案結尾簽名。

多個檔案組成一個有效的 zip 存檔以解壓縮,將檔案連線成一個 zip,然後解壓縮結果。

cat rnd.z* > final.zip
unzip final.zip