介紹如何在 Linux 系統下以 zip
與 unzip
指令壓縮與解壓縮檔案。
若要將 mydata1.txt
與 mydata2.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 檔案大小過大,可以考慮以 zipsplit
指令搭配 -n
參數指定每塊分割大小上限,將大型的 ZIP 檔案分割為多個小型的 ZIP 壓縮檔:
# 將壓縮檔切割為多個 1MB 以下的壓縮檔 zipsplit -n 1048576 archive.zip
zipnote
指令可以用來輸出或寫入 ZIP 檔案的註解資訊:
# 輸出壓縮檔註解資訊 zipnote archive.zip > comments.tmp # 寫入壓縮檔註解資訊 zipnote -w archive.zip < comments.tmp