归档与压缩 - 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

分类：​

- 数据压缩与归档
- 命令行

归档与压缩
添加话题