歸檔與壓縮 - Arch Linux 中文维基

跳至內容

# 歸檔與壓縮

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Archiving and compression，最近一次同步於 2023-2-12，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

根據 Unix 哲學,歸檔與壓縮工具應當是分離的:

- 歸檔工具將多個文件合併為一個歸檔文件，例如 tar。
- 壓縮工具壓縮和解壓縮數據，例如 gzip。

這些工具通常按順序使用，首先創建一個歸檔文件，然後壓縮它。

當然，也有一些工具可以同時實現這兩個功能，它們往往還提供加密、錯誤檢測和恢復功能。

## 僅歸檔

名稱 | 包 | 手冊 | 說明
--- | --- | --- | ---
GNU tar | tar包 | tar(1), info | 用於處理無處不在的 tar 歸檔文件(tarball)的核心工具，pacman 和 AUR 使用這些文件。
libarchive | libarchive包 | bsdtar(1) bsdcpio(1) | tar 和 cpio 的實現,同時也提供了一個庫。pacman 和 mkinitcpio 使用該庫。
ar | binutils包 | ar(1) | 在 tar 之前的傳統 Unix 歸檔程序。現在只用於創建靜態庫文件。
cpio | cpio包 | cpio(1) | 通過 stdin/stdout 進行文件歸檔，支持 cpio 和 tar 格式。
DAR | darAUR | dar(1) | 歸檔以備份大型活動文件系統，處理硬連結、擴展屬性、稀疏文件和 inode 類型。

提示：GNU 和 BSD tar 都自動為 bzip2、compress、gzip、lzip、lzma、lzop、zstd 和 xz 壓縮歸檔執行解壓縮。lz4 只有 BSD tar 支持（但是 GNU tar 可以使用`--use-compress-program=lz4`/`-Ilz4`進行等效操作）。當創建歸檔文件時，兩者都支持`-a`開關，以根據文件擴展名通過正確的壓縮程序自動處理創建的歸檔。BSD tar 根據格式識別壓縮格式，而 GNU tar 只根據文件擴展名猜測壓縮格式。

參見#僅歸檔用法。

## 壓縮工具

### 僅壓縮

這些壓縮程序實現自己的文件格式。

名稱 | 包 | 手冊 | 擴展名 | Tar 擴展名 | 說明 | 並行實現
--- | --- | --- | --- | --- | --- | ---
bzip2 | bzip2包 | bzip2(1) | .bz2, .bz | .tbz2, .tbz | 使用 Burrows–Wheeler 算法。 | lbzip2包, pbzip2包
bzip3 | bzip3包 | bzip3(1) | .bz3 | .tbz3 | 使用 Burrows–Wheeler 算法。 |
gzip | gzip包 | gzip(1) | .gz, .z | .tgz, .taz | GNU zip, 基於 DEFLATE 算法。 | pigz包, bgzip(1) (htslibAUR 的一部分), crabzAUR
lrzip（英語：lrzip） | lrzip包 | lrzip(1) | .lrz |  | 改良版的 rzip,使用多種算法。 | 是多線程的
LZ4 | lz4包 | lz4(1) | .lz4 |  | 用 C 語言編寫，專注於壓縮和解壓縮速度。 | 可以是多線程的，儘管 lz4包 不是。查看 https://lz4.github.io/lz4/ 獲取替代方案。
lzip | lzip包 | lzip(1) | .lz |  | 使用 LZMA. | plzipAUR
lzop | lzop包 | lzop(1) | .lzo | .tzo | 使用 LZO 庫(lzo包). |
xz | xz包 | xz(1) | .xz, .lzma | .txz, .tlz | 使用 LZMA，GNU coreutils包 和內核歸檔文件的默認值。 | 是多線程的, pixz包, pxz-gitAUR
zstd | zstd包 | zstd(1) | .zst |  | 使用 Zstandard 算法。 | 是多線程的

- 並行實現通過使用多個CPU核心提高速度。
- Tar 擴展名是指使用`tar`和壓縮工具的壓縮歸檔，例如`.tzo`相當於`.tar.lzo`。
- 參見#僅壓縮用法。

### 歸檔和壓縮

名稱 | 包 | 手冊 | 擴展名 | 說明
--- | --- | --- | --- | ---
p7zip | p7zip包 | 7z(1) | .7z | 7-zip 命令行的第三方 POSIX 移植。
7-Zip | 7-zipAUR、7-zip-fullAUR 或 7-zip-fullCNRepo | - | 一個高壓縮比的文件歸檔器的上游 Linux 版本。
RAR | rarAUR, unrar包 | rar(1) | .rar | rar 格式和工具都是專有的。
t2sz | t2szAUR |  | .tar.zst .tzst | 用 C 寫得 Tar 歸檔工具，使用成員對齊的 zstd 壓縮
tarlz | tarlzAUR | tarlz(1) | .tar.lz .tlz | 用 C++ 寫得 Tar 歸檔工具，使用成員對齊的 lzip 壓縮
ZIP | zip包, unzip包 | zip(1), unzip(1) | .zip | 在 Linux 世界之外廣泛使用。
Unarchiver | unarchiver包 | unar(1), lsar(1) | many | Mac 應用程式的命令行工具，支持40多種歸檔格式。
ZPAQ | zpaqAUR | zpaq(1) | .zpaq | 用 C++ 編寫的高壓縮比歸檔程序，使用多種算法。
LHa | lhasa包, lhaAUR | lha(1) | .lzh (在 Amiga 上: .lha) | LZH/LHA 歸檔，支持 lh7 方法。
WinAce | unace包 | unace(1) | .ace | ACE 文件格式和歸檔工具都是專有的。

參見#歸檔和壓縮用法。

### 功能圖表

上面的一些工具能夠處理多種格式，允許安裝更少的軟體包。

#### 解壓縮

名稱 | gzip | bzip2 | ZIP | LHa/LZH | RAR | compress | CAB | ARJ
--- | --- | --- | --- | --- | --- | --- | --- | ---
gzip包 | 是 | 否 | 部分1 | 否 | 否 | 是 | 否 | 否
p7zip包 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是
unarchiver包 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 部分

1. gzip包 的 gunzip 只能解壓縮單個成員的 ZIP 文件。

## 用法比較

### 僅歸檔用法

名稱 | 創建歸檔 | 提取歸檔 | 列出內容
--- | --- | --- | ---
tar(1) | `tar cfv archive.tar file1 file2` | `tar xfv archive.tar` | `tar -tvf archive.tar`
cpio(1) | `ls file1 file2 | cpio -o > archive.cpio` | `cpio -i -vd < archive.cpio` | `cpio -t < archive.cpio`

### 僅壓縮用法

名稱 | 壓縮 | 解壓縮 | 解壓縮到 stdout
--- | --- | --- | ---
bzip2(1) | `bzip2 file` | `bzip2 -d file.bz2` | `bzcat file.bz2`
gzip(1) | `gzip file` | `gzip -d file.gz` | `zcat file.gz`
lrzip(1) | `lrzip file` `lrztar folder` | `lrzip -d file.lrz` `lrztar -d folder.tar.lrz` | `lrzcat file.lrz`
xz(1) | `xz file` | `xz -d file.xz` | `xzcat file.xz`

### 歸檔和壓縮用法

名稱 | 壓縮 | 解壓縮 | 解壓縮到 stdout | 列出內容
--- | --- | --- | --- | ---
7z(1) | `7z a archive.7z file1 file2` | `7z x archive.7z` | `7z e -so archive.7z file1` | `7z l archive.7z`
rar(1) | `rar a archive.rar file1 file2` | `rar x archive.rar` | `rar p -inul archive.rar file1` | `rar l archive.rar`
zip(1), unzip(1) | `zip archive.zip file1 file2` | `unzip archive.zip` | `unzip -p archive.zip file1` | `unzip -l archive.zip`
lha(1) | `lha ao7 archive.lzh file1 file2` | `lha x archive.lzh` |  | 簡單: `lha l archive.lzh` 詳細: `lha v archive.lzh`

## 便利工具

- atool — 用於管理各種類型的文件歸檔的腳本。

  https://www.nongnu.org/atool/ || atool包

- dtrx — 一個智能歸檔提取工具。

  https://github.com/brettcs/dtrx || dtrxAUR

- J7Z — 用 Java 寫得 Linux GUI 工具，嘗試簡化數據壓縮和備份。它可以創建 7z, BZip2, Zip, GZip, Tar 歸檔。

  http://j7z.xavion.name/ || j7zAUR

- unp — 命令行工具，可以輕鬆解包歸檔文件。

  https://github.com/mitsuhiko/unp || python-unpAUR

- unpack — 用於處理多種歸檔格式的包裝器腳本。

  https://github.com/githaff/unpack || unpack-gitAUR

- zutils — 用 C++ 編寫，包含 zcat(1)/zgrep(1)/zdiff(1)，以像 bsdcat(1) 一樣透明地透明地處理壓縮和未壓縮文件的任何組合。支持 bzip2、gzip、lzip、xz和zstd。通常與常見（解）壓縮器的並行變體（如 pixz(1)）結合使用。

  https://www.nongnu.org/zutils/zutils.html || zutilsAUR

- Bash/函數#提取

## 確定歸檔格式

要提取歸檔，需要確定其文件格式。如果文件名正確，則可以從文件擴展名推斷其格式。

否則，您可以使用 file包 工具，參見 file(1)。

## 小眾、罕見或過時的工具

名稱 | 包 | 擴展名 | 包
--- | --- | --- | ---
ARC | arcAUR | .arc, .ark | 在撥號 BBS 的早期非常流行。被 ZIP 取代。
ARJ | arj包 | .arj | 1990年代中期在 DOS/Windows 上使用的歸檔程序，源中包為一個開源克隆。
compress | ncompress包 | .Z | 在 gzip 出現之前是 UNIX 壓縮工具的事實標準，因使用哈夫曼算法而成功。Man 頁面：pack(1)。
PAR2 | par2cmdline包 | .par2 | 用於提高數據完整性的奇偶校驗歸檔程序。參見 Parchive（英語：Parchive）。
shar | sharutils包 | .shar | 用於創建自提取歸檔。這些自提取歸檔是有效的 shell 腳本。
Zoo | zooAUR | .zoo | 在 PKZIP 流行之前，在 OpenVMS 作業系統上流行。

## 文件系統壓縮

有些文件系統支持動態壓縮文件數據:

- 默認情況下，Btrfs可以配置為壓縮單個文件、目錄或整個卷。
- 在ZFS上，可以在池或文件系統上啟用壓縮。

## 設備映射器壓縮

目前正在將開源的 VDO 項目主線化(集成到 Linux 內核項目中)，該項目為提高存儲效率提供了一個重複數據消除和壓縮設備映射器層。以下包可供選擇：

- vdo — 用於管理 VDO 卷的用戶空間工具

  https://github.com/dm-vdo/vdo || vdoAUR

- kvdo — 兩個內核模塊，提供重複數據消除和/或壓縮塊存儲池

  https://github.com/dm-vdo/kvdo || kvdo-dkmsAUR

## 壓縮庫

- Brotli — 使用LZ77算法、霍夫曼編碼和二階上下文建模的數據流壓縮算法。

  https://github.com/google/brotli || brotli包

- libzip — 提供ZIP文件的創建和提取。由 KDE 和 Deepin 代替 zip/unzip 工具使用。

  https://libzip.org || libzip包

- zlib — 壓縮庫中實現了 gzip 和 PKZIP 中的 deflate 壓縮方法。

  https://www.zlib.net/ || zlib包

- Zopfli — Google 提供的高壓縮比文件壓縮器，使用了一種名為 zopfli 的 deflate 兼容算法。

  https://github.com/google/zopfli || zopfli-gitAUR

## 故障排除

### 日語文件名亂碼

Windows 的日文版本使用 Shift-JIS 編碼 ZIP 歸檔。默認情況下，這些歸檔在解壓縮時會受到亂碼文件名的影響。要正確解壓縮，請在命令行中使用 shift-jis 選項解壓縮。

    $ unzip -O shift-jis nihongo.zip

或者也可以使用社區提供的 unzip-natspecAUR 包。

## 參見

- 應用程式列表/工具#Archive_managers
- 應用程式列表/多媒體#Image_compression
- Wikipedia:Comparison of file archivers
- Wikipedia:List of archive formats
- Wikipedia:Comparison of archive formats

分類：​

- 數據壓縮與歸檔
- 命令行

歸檔與壓縮
新增話題