归档与压缩

来自 Arch Linux 中文维基

根据 Unix 哲学,归档与压缩工具应当是分离的:

  • 归档工具将多个文件合并为一个归档文件,例如 tar
  • 压缩工具压缩和解压缩数据,例如 gzip

这些工具通常按顺序使用,首先创建一个归档文件,然后压缩它。

当然,也有一些工具可以同时实现这两个功能,它们往往还提供加密、错误检测和恢复功能。

仅归档[编辑 | 编辑源代码]

名称 手册 说明
GNU tar tar tar(1), info 用于处理无处不在的 tar 归档文件(tarball)的核心工具pacmanAUR 使用这些文件。
libarchive libarchive bsdtar(1)
bsdcpio(1)
tarcpio 的实现,同时也提供了一个库。pacmanmkinitcpio 使用该库。
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 - 一个高压缩比的文件归档器的上游 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. gzipgunzip 只能解压缩单个成员的 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

确定归档格式[编辑 | 编辑源代码]

要提取归档,需要确定其文件格式。如果文件名正确,则可以从文件扩展名推断其格式。

否则,您可以使用 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 包。

参见[编辑 | 编辑源代码]