創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2020年3月29日 星期日

淺談Ubuntu上常見的壓縮與封存命令

摘要

前面談過tar,本文談談以下幾個Ubuntu上壓縮命令與archive封存(或譯為歸檔)命令:
  • compress
  • gzip
  • bzip2
  • xz
  • zip
  • 7z
只談命令行(CLI)的使用,若要圖形使用者介面GUI,桌面系統內建的壓縮管理員或PeaZip都很好用。使用環境同樣是Ubuntu MATE 18.04。

在進入正題之前,先談一下data compressor(壓縮程式)與file archiver(封存程式),上列的前4個屬前者,最後2個與tar則屬後者。

壓縮程式與封存程式

一般習慣上會把像WinZip, WinRar, 7-zip這類稱為壓縮程式,但在這裡把這類可將多個檔案或目錄,塞進一個容器檔案中,同時在必時也可使用壓縮演算法把要塞進去的檔案做壓縮處理的程式,稱為封存程式;而單純只對單一檔案做資料壓縮處理的程式,稱為壓縮程式。

Unix的設計理念,把個別程式的功能單純化設計好,聯合使用多支程式時,就可達成強大、複雜的功能。所以tar只提供封存功能,但以指定壓縮選項的方式來聯合使用其他壓縮程式,就可達成封存且壓縮的目的;想加密,再使用加密程式如gpg即可。

以下依這兩類分別做簡介,除了compress,在Ubuntu 18.04中皆已內建,無需額外安裝。每類所列的程式是依照推出時間的順序而定,也就是排在前的較早。

壓縮程式

請記得本文所列的壓縮程式主要是設計用來壓縮單一個別檔案,若想壓縮多個檔案進一個檔案,實際上就是把多個檔案塞進封存檔,做壓縮,也就是配合tar使用,指定壓縮選項即可;不然就是改用後面帶有壓縮功能的封存程式。前者是Unix類用戶較習慣的做法,後者則通常是Dos/Windows用戶較習慣的做法。

在多數使用情境中,壓縮程式往往搭配著tar使用,單獨使用的機會不是那麼高,所以如果不熟悉用法也不是那麼要緊,稍了解即可。如果有經常使用的需求,也許想採用較後面較新的東西,但了解一下較早的,有助了解這些軟體的設計與使用,因為後者通常會延用前者的一些設計,以方便原有舊軟體的使用者不須費太多功夫就可熟悉新軟體的使用。原則上,可先搞懂gzip的用法,bzip2與xz的用法也類似。

compress

compress是傳統Unix壓縮指令,基於LZW壓縮演算法,其壓縮檔的副檔名是.Z。相較於更現代的gzip與bzip2,使用較少記憶體也較快速,但壓縮比率較低。在Debian中,解壓程式稱為 uncompress.real,這樣做是為了避免撞名。

因已漸漸被後面介紹的指令所取代,這裡就不談它的用法,可見man page。非預設安裝,真要用的話可安裝一下:


$ sudo apt install ncompress
如果沒安裝,tar的Z選項會失敗,不過現在較少採用這個壓縮選項,以下的gzip, bzip2或xz是較常用的。

gzip

gzip是被創建來取代compress的自由軟體,開頭的g即代表著GNU。基於DEFLATE演算法,副檔名是.gz。gzip格式也用在HTTP壓縮。

指令形式:
gzip [ -acdfhklLnNrtvV19 ] [-S suffix] [ name ... ]
gunzip [ -acfhklLnNrtvV ] [-S suffix] [ name ... ]
zcat [ -fhLV ] [ name ... ]
被壓縮的檔案名稱後會加上.gz,保有相同擁有者、模式、存取與修改時間。

壓縮檔可以用gzip -d或gunzip或zcat還原。若壓縮檔中的檔案名稱,解出到新檔案系統上過長或不適合時,會給個合法名稱。

gunzip目前可解壓由gzip, zip, compress所建立的檔案。zip建立的檔案,僅在只有單一成員以deflation方法壓縮時,gzip才能解壓縮,這功能用在轉換tar.zip到tar.gz格式。

zcat相當於gunzip -c,解壓縮並連接(concatenate)到標準輸出。

gzip的常用選項:
  • -c --stdout --to-stdout:輸出寫到標準輸出;原檔不動。
  • -d --decompress --uncompress:解壓縮。
  • -h --help:顯示用法。
  • -k --keep:壓縮或解壓縮時,保留(不刪除)輸入檔。
  • -l --list:列示壓縮/未壓縮大小、壓縮比率之資訊。
  • -n --no-name:壓縮時不存原始檔名與時間戳記。解壓縮時,若有的的話,不還原原始檔名與原時間戳記。解壓縮時此選項是預設。
  • -N --name:壓縮時總是儲存原始檔名與時間戳記,此是預設。解壓縮,若有的話,還原原始檔名與原時間戳記。
  • -q --quiet:不顯示警示。
  • -r --recursive:遞迴壓縮/解壓縮目錄中的檔案。
  • -S .suf --suffix .suf:以指定的.suf副檔名取代.gz。
  • -t --test:測試、檢查壓縮檔的完整性。
  • -v --verbos:顯示每個檔案壓縮或解壓縮的名稱與減少的百分比。
  • -V --version:顯示版號資訊。
  • -# --fast --best:以#數字調整壓縮速度,-1或--fast是最快壓縮方法(較少壓縮),-9或-best是最慢壓縮方法(最佳壓縮)。預設壓縮程度是-6。
範例,壓縮所有.txt檔:

$ gzip *.txt
此例的所有.txt檔都會被壓縮,每個新檔的檔名後都加上.gz,原有的.txt檔會不見。如果想保留原有檔案,加上 -k 選項。

多個壓縮檔是可以連接,但實際上是將其中的內容連成一個,並不是一個壓縮檔中有多個檔案:

$ gzip -c file1.txt > new_file.txt.gz
$ gzic -c file2.txt >> new_file.txt.gz
效果等同於:

$ gzip -c file1.txt file2.txt > new_file.txt.gz
這大約相當於:

$ cat file1.txt file2.txt | gzip > new_file.txt.gz
後者連結後做一次壓縮的方式會比前者的壓縮好。

gzip較詳細的使用法可見man page。gunzip與zcat都是gzip的捷徑(shortcut)形式,會gzip後大致上也知道另兩個的用法。

以下的bzip2, xz都如同gzip般有各自的捷徑指令,為節省篇幅,主要只介紹主要指令。事實上它們的語法與行為很接近,只要學會gzip,其他兩個的基礎使用也就不難了。

bzip2

bzip2採用數個壓縮技術層,副檔名是.bz2。對於多數檔案的壓縮,比前述採用LZW與Deflate壓縮演算來的有效率,但較慢。LZMA通常比bzip2在空間上更有效率,但更慢的壓縮速度,然而可較快解壓縮。

指令形式:
bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]
bzip2recover filename
如同gzip般有bunzip2與bzcat。bunzip2相當於bzip2 -d。bzcat相當於bzip2 -dc或bunzip2 -c。

命令選項相當接近於gzip,但並不相等,這是故意這樣設計的。如同gzip,每個壓縮檔會有原始檔相同的修改時間、權限、擁有者,而壓縮檔的檔名後則是加上.bz2;解壓時則會拿掉檔名後面的.bz2, .bz或.tbz2, .tbz成為tar(gzip也有類似的行為,上面沒寫到),若不是這些結尾的,bzip2會猜不出來而用原檔名加上.out。

bzip2與bunzip2預設不會覆寫既存的檔案,如果要話,指定 -f 選項。

如果沒有指定檔名,從標準輸入壓縮到標準輸出,也就是很可能在螢幕上顯示壓縮的——令人看不懂的——內容。解壓縮無指定檔名時,反之亦然。

即使壓縮檔稍大於原始檔,還是會做壓縮。小於100 bytes易於變較大,因壓縮機制有50 bytes的常數耗用。

bzip2常用選項:
  • -c --stdout:壓縮或解壓縮到標準輸出。
  • -d --decompress:強迫解壓縮。bzip2, bunzip2與bzcat事實上是相同程式,做何動作的決定是基於使用哪個名稱。此選項蓋掉此機制,強迫解壓縮。
  • -z --compress:-d的互補,強迫壓縮,不管所用程式名稱為何。
  • -f --force:強迫覆寫輸出檔案。
  • -h --help:顯示用法。
  • -k --keep:壓縮或解壓縮時,保留(不刪除)輸入檔。
  • -q --quiet:不顯示非重要警示。
  • -t --test:測試、檢查壓縮檔的完整性。
  • -v --verbos:顯示壓縮比。增加v數量可增加顯示的資訊量;即-vv比-v有較多資訊量。
  • -L --license -V --version:顯示版號、授權條款。
  • -1 (or --fast) to -9 (or --best):壓縮時設定block size成100k, 200 k, ... 900k。解壓時無作用。--fast與--best代名主要只是為與gzip相容。--faster並不顯著更快,而--best僅是選用預設行為。
  • -- 把其隨後的字當檔案名稱,即使以 - 開頭。用來處理檔名以 - 開頭的檔案,如bzip2 -- -myfilename。
bzip2recover用來修復受損檔案,只接受單一參數,即受損檔名。輸出一些檔案 rec00001file.bz2, rec00002.bz2 等等……,其中包含擷取出的區塊。這樣的設計可方便於像 $ bzip2 -dc rec*file.bz2 > recovered_data 以得到修復好的檔案。

較詳細說明可見man page

xz

壓縮/解壓縮都有xz與lzma檔案格式,副檔名分別是.xz或.lzma,但LZMA是舊式,故預設以xz壓縮。xz的壓縮比率比gzip與bzip2還高。解壓縮比bzip2快,比gzip慢。壓縮時較gzip慢許多,在高壓縮程度時,比bzip2慢。支援多緒Multi-threaded壓縮(-T選項)。幾個Linux流通版,包含Fedora, Slackware, Ubuntu與Debian使用xz來壓縮軟體包裝。

指令形式:
xz [option...] [file...]
幾個指令的代名:
  • unxz:相當於xz --decompress
  • xzcat:xz --decompress --stdout
  • lzma:xz --format=lzma
  • unlzma:xz --format=lzma --decompress
  • lzcat:xz --format=lzma --decompress --stdout
在撰寫解壓縮檔案的腳本時,建議總是使用xz與合適參數(xz -d 或 xz -dc)以取代unxz與xzcat的名稱。

若沒有指定檔名或檔名為 - ,從標準輸入讀取,寫到標準輸出。如果標準輸出是螢幕,xz會顯示錯誤並跳過該檔,拒絕把壓縮的資料寫到stdout;反之亦然,拒絕從標準輸入讀入壓縮資料,如果它是螢幕的話。

xz常用選項:
操作模式:
如有給予多個操作模式選項,只最後一個有效。
  • -z, --compress:壓縮。在沒有指定操作模式選項,且沒有其他指令名稱的隱喻(如unxz隱喻--decompress)時的預設操作模式。
  • -d, --decompress, --uncompress:解壓縮。
  • -t, --test
  • -l, --list
操作修飾子:
  • -c, --stdout, --to-stdout
  • -f, --force
  • -k, --keep
  • -S .suf, --suffix=.suf
  • --files[=file]:從file讀取要處理的檔案名稱,若省略file,從標準輸入讀取檔名。檔名必須以換行字元做結束。 - 被視為一般檔名而不是標準輸入。
基本檔案格式與壓縮選項:
  • -F format, --format=format:指定壓縮或解壓縮的格式。
    • auto:預設。壓縮時,auto相當於xz。解壓時,自動偵測輸入檔的格式。raw stream無法自動偵測。
    • xz:xz格式。
    • lzma:舊格式。
    • raw:raw stream。只對進階使用者有用。
  • -C check, --check=check:指定完整性檢查的種類。此檢查自未壓縮資料計算並存在.xz檔中,故只在壓縮到.xz檔才有作用。完整性檢查,有的話,在.xz檔解壓縮時做檢查。
    • none:不做檢查。
    • crc32:CRC32。
    • crc64:CRC64。預設。
    • sha256:較CRC32與CRC64慢。
  • --ignore-check:解壓時不做完整性檢查。
  • -0 ... -9:選擇壓縮程度。預設是-6。避免使用--fast, --best,這些只是為了向下相容。
  • -e, --extreme:極緻壓縮,期望取得稍好的壓縮比率,但也可能更糟。
  • --block-size=size:與多緒有關,下一項也是。
  • --block-list=sizes
  • --memlimit-compress=limit:限制壓縮所用的記憶體量。limit有幾種表示法:bytes值,可後置像MiB,如80MiB;總RAM的百分比,如70%;以0重設為預設值。
  • --memlimit-decompress=limit:限制解壓縮用的記憶體量。
  • -M limit, --memlimit=limit, --memory=limit:同時限制壓縮與解壓縮的記憶體量。
  • --no-adjust:壓縮設定超過記憶體使用限制時顯示錯誤並離開。預設是會往下調整使記憶體使用限制不致超過。建立raw stream時自動調整總是關閉。
  • -T threads, --threads=threads:指定所用的工作緒的數量。設定為0表使用系統中CPU內核中可用的緒量。解壓縮的多緒尚未實作出來。
其他選項:
  • -q, --quiet
  • -v, --verbose
  • --info-memory:顯示有多少實體記憶體與使用的限制量。
  • -h, --help:顯示常用選項的用法。
  • -H, --long-help:顯示所有用法。
  • -V, --version
上述有些選項沒寫解釋的,可對照gzip與bzip2的,因為意思接近。xz是較晚發展出來,也就是較新的設計,有較多的功能,但一些基本用法還是延用gzip的習慣,這裡就不寫太細,詳情可見man page

7z也支援此格式,故在Windows上,.xz檔可使用7-zip來解壓縮。

==== 未完,見續篇 ====

沒有留言:

張貼留言