Linux zstd命令详解

zstd命令 - Facebook开发的Zstandard压缩算法,提供优秀的压缩比与速度平衡,支持多线程压缩

命令简介

zstd(Zstandard)是Facebook开发的一种实时压缩算法,旨在提供高压缩比和快速的压缩/解压速度。它结合了LZ77和tANS编码技术,在现代硬件上表现出色。

核心优势: 优秀的压缩比与速度平衡,支持多线程,向后兼容性好
  • 开发者: Facebook(Meta)
  • 文件扩展名: .zst, .zstd
  • 压缩速度: 非常快(支持多线程)
  • 解压速度: 极快(通常比压缩更快)
  • 压缩率: 优秀(接近xz,远好于gzip)
  • 内存占用: 可配置,灵活性高
  • 主要特性: 多线程支持、字典训练、长距离模式

命令语法

# 基本语法
zstd [选项] [文件...]

# 压缩语法
zstd [选项] 源文件 [目标文件.zst]

# 解压语法
zstd -d [选项] 源文件.zst [目标文件]
unzstd [选项] 源文件.zst [目标文件]

常用选项

选项 说明
-# 压缩级别(1-19,22,默认为3,数值越大压缩率越高)
-d, --decompress 解压
-T#, --threads=# 使用指定数量的线程(0=自动检测CPU核心数)
-f, --force 强制覆盖输出文件
-k, --keep 保留源文件
-o FILE 指定输出文件名
-v, --verbose 显示详细信息
-q, --quiet 静默模式
-t, --test 测试压缩文件的完整性
--ultra 启用超模式(级别20-22,需要更多内存)
--long[=#] 启用长距离模式(参数为窗口大小,2^#)
-D FILE 使用字典文件进行压缩/解压
--train FILE 从文件集训练字典
-l, --list 列出.zst文件信息
-C, --check 添加完整性校验和(默认启用)

安装方法

# Ubuntu/Debian (18.04+)
sudo apt install zstd

# 或从GitHub安装最新版
wget https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz
tar -xzf zstd-1.5.5.tar.gz
cd zstd-1.5.5
make
sudo make install

# CentOS/RHEL 7+
sudo yum install epel-release
sudo yum install zstd

# CentOS/RHEL 8+/Fedora
sudo dnf install zstd

# Arch Linux
sudo pacman -S zstd

# macOS (使用Homebrew)
brew install zstd

# 验证安装
zstd --version

基础使用示例

压缩单个文件
# 基本压缩(默认级别3)
zstd file.txt

# 压缩后生成file.txt.zst,删除原文件

# 压缩并保留原文件
zstd -k data.log

# 指定压缩级别(1最快,19最高压缩率)
zstd -1 fast.txt    # 最快压缩
zstd -9 balance.txt # 平衡模式
zstd -19 high.txt   # 高压缩率

# 指定输出文件名
zstd input.txt -o output.zst
解压文件
# 基本解压
zstd -d file.txt.zst

# 解压并保留压缩文件
zstd -dk archive.zst

# 指定解压后的文件名
zstd -d compressed.zst -o decompressed.txt

# 使用unzstd命令(等同于zstd -d)
unzstd file.zst

# 解压到标准输出
zstd -dc archive.zst | less
多线程压缩(加速大文件)
# 自动检测CPU核心数
zstd -T0 largefile.dat

# 使用4个线程
zstd -T4 bigfile.dat

# 多线程压缩并保留原文件
zstd -T0 -k hugefile.dat

# 多线程高压缩级别
zstd -19 -T0 large_dataset.dat
测试和查看文件信息
# 测试.zst文件的完整性
zstd -t data.zst

# 测试并显示详细信息
zstd -tv archive.zst

# 列出.zst文件信息
zstd -l file.zst

# 输出示例:
# Frames  Skips  Compressed  Uncompressed  Ratio  Check  Filename
#      1      0     50.0 MiB    100.0 MiB  2.000  XXH64  file.zst

# 查看详细文件信息
zstd -lv *.zst

高级特性

超模式(Ultra模式)
# 启用超模式(级别20-22)
zstd --ultra -20 file.txt

# 超模式配合多线程
zstd --ultra -22 -T0 largefile.dat

# 超模式保留源文件
zstd --ultra -21 -k data.bin
注意:超模式需要更多内存,但能获得更高的压缩率
长距离模式(处理长距离重复)
# 启用长距离模式
zstd --long file.txt

# 指定长距离窗口大小(2^27 = 128MB)
zstd --long=27 large_log.txt

# 长距离模式配合高压缩级别
zstd -19 --long huge_database.sql

# 查看支持的最大窗口大小
zstd --long-help
字典压缩(针对小文件优化)
# 从样本文件训练字典
zstd --train sample_files/* -o dictionary.dict

# 使用字典进行压缩
zstd -D dictionary.dict file.txt

# 使用字典解压
zstd -d -D dictionary.dict file.txt.zst

# 批量使用字典压缩
for file in *.txt; do
    zstd -D dictionary.dict "$file"
done
提示:字典压缩特别适合大量相似的小文件,如日志、配置文件等

与tar命令结合使用

方法1:使用管道(推荐)
# 创建.tar.zst压缩包
tar -cf - directory/ | zstd > archive.tar.zst

# 创建并指定压缩级别
tar -cf - directory/ | zstd -19 -T0 > archive.tar.zst

# 解压.tar.zst文件
zstd -dc archive.tar.zst | tar -xf -

# 解压到指定目录
zstd -dc archive.tar.zst | tar -xf - -C /target/directory
方法2:使用tar的--zstd选项(需要较新版本)
# tar 1.31+ 支持原生zstd
tar -c --zstd -f archive.tar.zst directory/

# 解压
tar -x --zstd -f archive.tar.zst

# 查看内容
tar -t --zstd -f archive.tar.zst

# 压缩级别设置(通过环境变量)
ZSTD_CLEVEL=19 tar -c --zstd -f archive.tar.zst directory/
注意:需要tar 1.31+版本才支持--zstd选项
方法3:结合find批量处理
# 查找并压缩所有.txt文件
find . -name "*.txt" -type f -exec tar -cf - {} + | zstd > texts.tar.zst

# 按日期压缩旧文件
find /var/log -name "*.log" -mtime +30 -type f -exec tar -cf - {} + | zstd > old_logs.tar.zst

性能比较与选择指南

工具 最佳场景 压缩速度 解压速度 压缩率 内存占用 推荐级别
zstd 通用场景,需要平衡 很快(多线程) 极快 优秀 中等 3-15
lz4 需要极速压缩 极快 极快 中等 1
gzip 兼容性要求高 一般 6
xz 需要最高压缩率 中等 最高 6
bzip2 传统系统 很慢 较高 9
zstd级别选择指南
  • -1 ~ -3: 快速压缩,适合实时数据
  • -4 ~ -9: 平衡模式,日常使用
  • -10 ~ -15: 高压缩率,适合备份
  • -16 ~ -19: 极高压缩率,速度较慢
  • -20 ~ -22: 超模式,需要更多内存
线程数建议
  • -T0: 自动检测CPU核心数(推荐)
  • -T1: 单线程,兼容性好
  • -T4: 4线程,平衡性能
  • -T8+: 多核心服务器
  • 注意:解压通常不需要多线程

实际应用场景

系统备份
# 全系统备份
sudo tar -cf - --exclude=/proc --exclude=/sys --exclude=/tmp / \
    | zstd -19 -T0 > backup.tar.zst

# 增量备份
rsync -av --link-dest=/previous_backup /source/ /increment/
tar -cf - /increment | zstd -T0 > increment.tar.zst
数据库备份
# MySQL备份
mysqldump -u root -p --all-databases | zstd -T0 > dump.sql.zst

# PostgreSQL备份
pg_dumpall | zstd -15 -T4 > pg_backup.sql.zst

# MongoDB备份
mongodump --archive | zstd -T0 > mongo_backup.archive.zst
日志管理
# 压缩旧日志
find /var/log -name "*.log" -mtime +7 -type f \
    -exec tar -cf - {} + | zstd > logs_week.tar.zst

# logrotate配置(使用zstd)
compress
compresscmd /usr/bin/zstd
compressext .zst
compressoptions -T0
开发部署
# 压缩node_modules
tar -cf - node_modules | zstd -T0 > node_modules.tar.zst

# Docker镜像层压缩
docker save image:tag | zstd -T0 > image.tar.zst

# 部署包压缩
tar -cf - build/ config/ | zstd -15 -T4 > deploy.tar.zst

常见问题解答

Q: zstd压缩级别这么多,如何选择?

建议:日常使用级别3-9,备份使用10-15,追求极限压缩率使用16-19(配合--ultra),实时数据使用1-3。

Q: zstd与gzip、xz如何选择?
  • zstd: 平衡性能,现代应用首选
  • gzip: 兼容性要求高,小文件
  • xz: 需要最高压缩率,不关心速度
  • lz4: 需要极速压缩,不关心压缩率
Q: 如何判断文件是否是zstd压缩格式?
# 使用file命令
file data.zst

# 输出示例:data.zst: Zstandard compressed data (v0.8)

# 使用zstd命令测试
zstd -t data.zst
Q: zstd字典压缩有什么优势?

字典压缩特别适合大量相似的小文件(如日志、配置文件),可以显著提高压缩率和速度。通过训练样本文件创建字典,然后在压缩/解压时使用。

相关命令

  • unzstd - zstd解压的快捷方式
  • zstdmt - zstd的多线程版本(旧版)
  • zstdcat - 不解压直接显示.zst文件内容
  • lz4 - 极速压缩工具
  • pigz - gzip的多线程版本
  • tar - 打包工具,常与zstd结合
命令总结
  • 压缩: zstd file.txttar -cf - dir/ | zstd -T0 > archive.tar.zst
  • 解压: zstd -d file.zstzstd -dc archive.zst | tar -xf -
  • 多线程: 使用 -T0(自动)或 -T4(4线程)
  • 级别选择: 日常用3-9,备份用10-15,极限用16-22
  • 高级功能: --ultra超模式,--long长距离模式,字典压缩
  • 最佳实践: 大文件使用多线程,相似小文件使用字典压缩