SHAR(SHell ARchive)格式是一種檔案封存和壓縮格式,通常用於 Unix 和類 Unix 作業系統。它被開發為一種將多個檔案和目錄封裝成單一封存檔案的簡單方式,以利於儲存和傳輸。SHAR 格式允許對封存檔案進行選擇性壓縮,以減少產生的封存檔案的整體大小。
SHAR 封存檔案基本上是一個 shell 腳本,其中包含一系列用於重建原始目錄結構和檔案的指令。當執行 SHAR 檔案時,shell 會詮釋指令並將檔案解壓縮到其原始位置。這使得 SHAR 封存檔案易於建立和解壓縮,而無需使用專門的封存工具,只要有 Unix shell 即可。
SHAR 封存檔案的結構包含標頭、檔案元資料和實際檔案內容。標頭通常包含一個 shebang 行(例如 `#!/bin/sh`)以指定 shell 腳本的詮釋器,接著是任何必要的 shell 指令或變數宣告。標頭也可能包含註解或解壓縮封存檔案的說明。
在標頭之後,SHAR 封存檔案包含一系列區段,每個區段代表一個要封存的檔案或目錄。每個區段都從檔案的元資料開始,例如其名稱、權限、擁有權和時間戳記。此元資料使用 shell 指令表示,這些指令在解壓縮檔案時設定適當的屬性。
在元資料之後,檔案的實際內容會包含在封存檔案中。檔案內容通常使用 `uuencode` 或 `base64` 編碼方式編碼,以確保內容與 shell 腳本的文字性質相容。編碼內容會分成較小的區塊,並在腳本中列印為一系列 `echo` 或 `printf` 指令。
如果 SHAR 封存檔案包含目錄,則目錄結構會使用 `mkdir` 指令和適當的元資料設定重新建立。然後,每個目錄中的檔案會以與上述相同的方式新增到封存檔案中。
SHAR 封存檔案可以選擇性地包含壓縮,以減少產生的檔案大小。與 SHAR 一起使用的常見壓縮方法包括 `gzip`、`bzip2` 和 `compress`。壓縮通常會在將個別檔案編碼並新增到封存檔案之前套用。當解壓縮 SHAR 封存檔案時,shell 腳本會自動解壓縮壓縮檔案。
若要建立 SHAR 封存檔案,可以使用 `shar` 指令,此指令在大部分 Unix 和類 Unix 系統上都可用。建立 SHAR 封存檔案的基本語法為:`shar [選項] 檔案1 檔案2 目錄1 ... > 封存檔案.shar`。指定的檔案和目錄將包含在產生的封存檔案中。
解壓縮 SHAR 封存檔案就像執行封存檔案中包含的 shell 腳本一樣簡單。這可以透過使用 `chmod` 指令讓 SHAR 檔案可執行,然後將其作為腳本執行:`chmod +x 封存檔案.shar && ./封存檔案.shar`。shell 會詮釋腳本中的指令並重建原始檔案和目錄。
SHAR 格式的一個優點是其簡單性和可攜性。SHAR 封存檔案可以在任何具有 Unix shell 的系統上建立和解壓縮,而無需額外的軟體。然而,與 `tar` 或 `zip` 等更進階的封存格式相比,SHAR 格式有一些限制。SHAR 封存檔案缺乏隨機存取個別檔案、完整性檢查或內建加密等功能。
儘管有其限制,SHAR 格式在某些情況下仍然有用,特別是在處理基於 Unix 的系統或需要簡單性的時候。它提供了一種直接的方式來封裝和分發檔案,作為單一的自解壓縮封存檔案。
總之,SHAR 封存檔案格式是一種簡單且可攜的方式,可以將多個檔案和目錄封裝成單一的 shell 腳本封存檔案。它允許選擇性壓縮,並且可以使用標準 Unix shell 指令輕鬆建立和解壓縮。儘管與其他封存格式相比缺乏進階功能,但 SHAR 仍然是 Unix 生態系統中一個有用的工具,可滿足基本的封存和分發需求。
檔案壓縮透過減少冗餘,讓相同的資訊佔用更少的位元。可壓縮的上限受資訊理論約束:對於無失真壓縮,上界是信源熵(參見香農的信源編碼定理以及他於 1948 年發表的《通信的數學理論》)。對於有失真壓縮,碼率與感知品質之間的權衡由率失真理論描述。
多數壓縮器分兩個階段。首先,模型會預測或揭露資料中的結構。接著,編碼器把這些預測轉成近乎最優的位元型態。經典的建模家族是 Lempel–Ziv:LZ77 (1977)及 LZ78 (1978) 會偵測重複子字串並輸出參照而非原始位元組。編碼面則由霍夫曼編碼(見原始論文1952)為較常出現的符號分配更短的碼字。算術編碼與範圍編碼再進一步逼近熵極限,而現代的非對稱數值系統(ANS)則用查表方式取得相似壓縮率。
DEFLATE(被 gzip、zlib 與 ZIP 採用)把 LZ77 和霍夫曼編碼結合。其規格完全公開:DEFLATERFC 1951、zlib 封裝RFC 1950以及 gzip 檔案格式RFC 1952。Gzip 針對串流設計並明確不提供隨機存取。PNG 影像則把 DEFLATE 規範為唯一的壓縮方式(視窗最多 32 KiB),詳見 PNG 規格「Compression method 0… deflate/inflate… at most 32768 bytes」與W3C/ISO PNG 第二版。
Zstandard (zstd): 針對高壓縮率與極快解壓而設計的通用壓縮器。格式記載於RFC 8878(以及HTML 鏡像)和 GitHub 上的參考規格文件。與 gzip 類似,基本框架並不追求隨機存取。zstd 的絕招是字典:從語料擷取的小樣本能大幅改善許多小型或相似檔案的壓縮(參閱python-zstandard 字典文件與Nigel Tao 的示例)。各實作同時支援「非結構化」與「結構化」字典(討論)。
Brotli: 為網頁內容(如 WOFF2 字體、HTTP)優化,結合靜態字典與類 DEFLATE 的 LZ+熵編碼核心。規格載於RFC 7932,文件同時指出滑動視窗為 2WBITS-16,WBITS 介於 [10, 24](1 KiB-16 B 至 16 MiB-16 B),並且不嘗試隨機存取。Brotli 常在網頁文字上優於 gzip,解碼也相當快速。
ZIP 容器: ZIP 是一種檔案封存格式,可存放使用多種壓縮法(deflate、store、zstd 等)的項目。權威規格是 PKWARE 的 APPNOTE(參見APPNOTE 入口、托管副本以及美國國會圖書館的概覽ZIP File Format (PKWARE)/ZIP 6.3.3)。
檔案壓縮是一個減少檔案或檔案群大小的過程,通常用於節省儲存空間或加速網路傳輸。
檔案壓縮運作原理,透過識別並移除數據中的冗餘資訊。它使用演算法將原始數據編碼在較小的空間裡。
兩種主要的檔案壓縮類型是無失真及有失真壓縮。無失真壓縮可以完美地恢復原始檔案,然而有失真壓縮在一些資料品質的損失下能得到更大的壓縮程度。
一個常見的檔案壓縮工具範例是WinZip,它支援多種壓縮格式包括ZIP與RAR。
在無失真壓縮中,質量保持不變。然而,在有失真壓縮中,可能會有顯著的質量下降,因為它刪除了一些較不重要的數據以便更大程度地減少檔案大小。
是的,相對於資料的完整性來說,檔案壓縮是安全的,尤其是無失真壓縮。然而,如同所有檔案,被壓縮的檔案也可能受到惡意軟體或病毒的攻擊,所以總是需要有專業的安全軟體以保護。
幾乎所有種類的檔案都可以被壓縮,包括文字檔案、圖像、音訊、視頻和軟體檔案。然而,壓縮程度可以因檔案類型而有顯著的不同。
ZIP檔是一種使用無失真壓縮以減少一個或多個檔案大小的檔案格式。在ZIP檔中的多個檔案被有效地打包為單一的檔案,這也讓分享變得更加容易。
技術上可行,儘管額外的大小減少可能非常小或甚至適得其反。壓縮一個已經壓縮 過的檔案有時可能會增加其大小,原因在於壓縮演算法所增加的metadata。
解壓壓縮的檔案,通常需要一個解壓縮或解zip的工具,像是WinZip或7-Zip。這些工具可以从壓縮格式中提取原始檔案。