Categories: Linux

Linux 壓縮、解壓縮 ZIP 檔案教學與範例

介紹如何在 Linux 系統下以 zipunzip 指令壓縮與解壓縮檔案。

壓縮檔案或目錄

若要將 mydata1.txtmydata2.txt 壓縮成一個 mydata.zip 壓縮檔,可以執行:

# 將 mydata1.txt 與 mydata2.txt 壓縮成 archive.zip
zip archive.zip mydata1.txt mydata2.txt

若要將 myfolder 目錄壓縮成 archive.zip,可以執行:

# 將 myfolder 目錄壓縮成 archive.zip
zip -r archive.zip myfolder

解壓縮檔案

若要解壓縮 ZIP 壓縮檔案,可以使用 unzip 指令。例如解壓縮 archive.zip這個壓縮檔案,則可執行:

# 解壓縮 archive.zip
unzip archive.zip

從標準輸入讀取檔案清單進行壓縮

zip 指令加上 -@ 參數,可從標準輸入讀取檔案清單並進行壓縮,這個參數通常會在 Linux 系統上以管線(pipe)的方式搭配其他指令來壓縮指定的檔案。

例如將目前目錄以下的所有 C 語言程式碼檔案(*.c*.h)全部找出來,交給 zip 壓縮:

# 尋找所有 *.c 或 *.h 檔案,交由 zip 進行壓縮
find . -name "*.[ch]" -print | zip -@ archive.zip

搭配管線進行壓縮、解壓縮

zip 指令在指定目的壓縮檔,可以使用連字線(-)來將壓縮資料輸出至標準輸出(standard output),再經由管線(pipe)交由其他指令進行後續處理。

例如以 zip 指令將目前目錄壓縮後:再將壓縮後的資料寫入磁帶:

# 將目前目錄壓縮後寫入磁帶
zip -r - . | dd of=/dev/nrst0 obs=16k

zip 指令也可以在指定來源檔案時,使用連字線(-)來從標準輸入(standard input)讀取要進行壓縮的資料。

例如將目前目錄以 tar 指令打包之後,交給 zip 進行壓縮:

# 將目前目錄以 tar 打包後再以 zip 壓縮
tar cf - . | zip archive.tar.zip -

這種方式的壓縮比通常會比單純使用 zip 搭配 -r 參數還要好,因為可以對不同檔案中重複的內容進行比較好的壓縮。

經由 tar 搭配 zip 產生的壓縮檔,可以用以下指令解開:

# 解壓縮 archive.tar.zip 壓縮檔
unzip -p archive.tar.zip | tar xf -

zip 沒有指定任何輸入檔案,且標準輸出也不是終端機時,就會自動從標準輸入讀取資料,壓縮之後導向至標準輸出,可以搭配其他指令進行串流資料的壓縮:

# 壓縮串流資料
tar cf - . | zip | dd of=/dev/nrst0 obs=16k

上面的指令就相當於以下這個指令,只不過上面的指令比較簡潔:

# 壓縮串流資料
tar cf - . | zip - - | dd of=/dev/nrst0 obs=16k

以上面這種串流壓縮的資料,可以使用 funzip 來進行串流資料的解壓縮:

# 解壓縮串流資料
dd if=/dev/nrst0  ibs=16k | funzip | tar xvf -

加密壓縮檔案

若要保護壓縮檔案的內容,可以在執行 zip 指令時加上 -e 參數,然後手動輸入密碼,加密壓縮的檔案,這樣產生的壓縮檔就必須要有密碼才能解開:

# 以手動輸入的密碼來加密壓縮檔案
zip -e -r archive.zip myfolder

壓縮的密碼除了以手動輸入的方式之外,也可以直接以參數來指定,這種方法可以用在自動化處理大量資料的狀況,但以明碼顯示密碼是不安全的,是要特別注意密碼外洩問題。

# 以 MY_PASSWORD 作為密碼來加密壓縮檔案
zip -P MY_PASSWORD -r archive.zip myfolder

若要將一個普通的 ZIP 壓縮檔加上密碼保護,可以使用 zipcloak 指令,其在執行時會需要手動輸入密碼,並將壓縮檔案中所有未加密的項目都加上密碼保護:

# 加密一般壓縮檔
zipcloak archive.zip

unzip 在遇到具有密碼保護的 ZIP 檔案時,會自動要求使用者輸入解壓縮的密碼,而若要自動化處理大量的加密壓縮檔案,可以使用 -P 參數來指定解壓縮密碼:

# 指定解壓縮密碼
unzip -P MY_PASSWORD archive.zip

分割 ZIP 壓縮檔

如果一個 ZIP 壓縮檔內包含大量的檔案,造成 ZIP 檔案大小過大,可以考慮以 zipsplit 指令搭配 -n 參數指定每塊分割大小上限,將大型的 ZIP 檔案分割為多個小型的 ZIP 壓縮檔:

# 將壓縮檔切割為多個 1MB 以下的壓縮檔
zipsplit -n 1048576 archive.zip

讀取與編輯 ZIP 壓縮檔註解

zipnote 指令可以用來輸出或寫入 ZIP 檔案的註解資訊:

# 輸出壓縮檔註解資訊
zipnote archive.zip > comments.tmp

# 寫入壓縮檔註解資訊
zipnote -w archive.zip < comments.tmp

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago