文章列表
8 分钟阅读

Linux 压缩与解压命令教程:tar、zip、gzip、xz、zstd 一次讲清


系列:Linux 命令基础

第 4 / 16 篇

  1. Tmux 入门教程:让 SSH 断线和多任务终端不再中断
  2. Tree 命令教程:快速查看和导出目录结构
  3. Linux 搜索命令教程:find、grep、locate、rg 应该怎么选
  4. Linux 压缩与解压命令教程:tar、zip、gzip、xz、zstd 一次讲清
  5. Linux 文本处理命令教程:cat、less、head、tail、wc、sort、uniq
  6. Linux 权限命令教程:chmod、chown、umask
  7. Linux 进程查看与管理:ps、top、htop、kill、jobs
  8. Linux 网络排查命令:ss、curl、dig、ping、traceroute
  9. systemctl 与 journalctl 入门:管理服务和查看日志
  10. rsync 使用指南:服务器文件同步与备份
  11. Linux 服务器安全基础:SSH、用户权限、防火墙和 fail2ban
  12. 线上问题排查流程:日志、端口、进程、磁盘、网络怎么一步步看
  13. 深入浅出:Linux 树状目录神器 tree 命令的安装与使用指南
  14. Linux 系统 Vim 编辑器终极指南:从入门到精通
  15. SSH 隧道实战:本地转发、远程转发和动态转发
  16. SSH Config 使用指南:别名、跳板机与多服务器管理

背景

在 Linux 服务器和日常开发中,压缩文件通常用于:

  • 备份项目代码、配置文件和日志;
  • 上传或下载多个文件;
  • 发布软件源码包;
  • 迁移网站、数据库导出文件或 Docker Compose 项目;
  • 节省网络传输和磁盘存储空间。

打包前如果需要确认目录结构,可以先用 Tree 命令教程:快速查看和导出目录结构;如果需要先定位日志、配置或源码文件,可以参考 Linux 搜索命令教程:find、grep、locate、rg 应该怎么选

Linux 中常见的文件后缀包括:

.tar 仅归档,不压缩
.tar.gz tar 归档后使用 gzip 压缩
.tgz .tar.gz 的常见简写
.tar.bz2 tar 归档后使用 bzip2 压缩
.tar.xz tar 归档后使用 xz 压缩
.tar.zst tar 归档后使用 zstd 压缩
.zip 常见跨平台压缩格式
.gz gzip 压缩的单个文件
.bz2 bzip2 压缩的单个文件
.xz xz 压缩的单个文件
.zst zstd 压缩的单个文件

最容易混淆的一点是:

tar:把多个文件或目录打包为一个归档文件
gzip / bzip2 / xz / zstd:负责压缩数据
zip:同时承担归档与压缩

因此,tar.gz 并不是一种独立程序,而是“先用 tar 打包,再用 gzip 压缩”的组合。

本文以 Debian / Ubuntu 为例,讲清楚 Linux 中最常用的压缩与解压命令,并给出适合项目备份和服务器操作的安全工作流。

步骤

1. 安装常用压缩工具

多数 Linux 发行版默认已经包含 targzip。如果需要处理 ZIP、XZ、Zstandard 等格式,可以安装以下工具:

Terminal window
sudo apt update
sudo apt install -y zip unzip gzip bzip2 xz-utils zstd

确认命令是否可用:

Terminal window
tar --version
gzip --version
zip -v
unzip -v
xz --version
zstd --version

常见工具对应关系:

tar 打包、解包 .tar / .tar.gz / .tar.xz 等归档
gzip 压缩、解压 .gz
bzip2 压缩、解压 .bz2
xz 压缩、解压 .xz
zstd 压缩、解压 .zst
zip 创建 .zip 压缩包
unzip 解压 .zip 文件

2. 先理解 tar 的常用参数

tar 是 Linux 中最常用的归档工具。它的常见参数如下:

-c 创建归档文件(create)
-x 解压归档文件(extract)
-t 查看归档内容(list)
-f 指定归档文件名(file)
-v 显示处理过程(verbose)
-z 使用 gzip 处理 .tar.gz
-j 使用 bzip2 处理 .tar.bz2
-J 使用 xz 处理 .tar.xz
-C 切换到指定目录后再解压或打包

一个实用记忆方式:

c:创建
x:解压
t:查看内容
f:文件名
v:显示过程

例如:

Terminal window
tar -czf backup.tar.gz project/

可以拆解为:

c:创建归档
z:使用 gzip 压缩
f:后面跟归档文件名
backup.tar.gz:输出文件名
project/:要打包的目录

3. 创建和解压 tar.gz 文件

.tar.gz.tgz 是 Linux 服务器中最常见的压缩格式,适合代码、日志、配置目录和备份文件。

创建压缩包:

Terminal window
tar -czf project-backup.tar.gz project/

创建时显示详细过程:

Terminal window
tar -czvf project-backup.tar.gz project/

解压到当前目录:

Terminal window
tar -xzf project-backup.tar.gz

解压时显示详细过程:

Terminal window
tar -xzvf project-backup.tar.gz

解压到指定目录:

Terminal window
mkdir -p /tmp/project-restore
tar -xzf project-backup.tar.gz -C /tmp/project-restore

只查看压缩包内容,不解压:

Terminal window
tar -tzf project-backup.tar.gz

只查看前 30 行:

Terminal window
tar -tzf project-backup.tar.gz | head -n 30

4. 创建和解压 tar.xz 文件

.tar.xz 通常适合需要更高压缩率的源码包、长期归档和离线备份。

创建 .tar.xz 文件:

Terminal window
tar -cJf project-backup.tar.xz project/

解压:

Terminal window
tar -xJf project-backup.tar.xz

解压到指定目录:

Terminal window
mkdir -p /tmp/project-restore
tar -xJf project-backup.tar.xz -C /tmp/project-restore

查看内容:

Terminal window
tar -tJf project-backup.tar.xz

.tar.xz 通常比 .tar.gz 更小,但压缩和解压耗时可能更长。日常快速备份常用 .tar.gz;追求更小文件体积的长期归档可考虑 .tar.xz

5. 创建和解压 tar.bz2 文件

.tar.bz2 是较常见的传统压缩格式,部分旧软件源码包仍会使用。

创建:

Terminal window
tar -cjf project-backup.tar.bz2 project/

解压:

Terminal window
tar -xjf project-backup.tar.bz2

查看内容:

Terminal window
tar -tjf project-backup.tar.bz2

日常新项目一般优先使用 .tar.gz.tar.xz.tar.zst。遇到 .tar.bz2 文件时,直接按上面的方式解压即可。

6. 使用 zstd 创建和解压 tar.zst 文件

Zstandard,常用命令为 zstd,兼顾压缩速度和压缩率,适合较大的备份文件和频繁的压缩任务。

创建 .tar.zst

Terminal window
tar --zstd -cf project-backup.tar.zst project/

解压:

Terminal window
tar --zstd -xf project-backup.tar.zst

查看归档内容:

Terminal window
tar --zstd -tf project-backup.tar.zst

如果系统的 tar 不支持 --zstd,可以拆为两步:

Terminal window
tar -cf - project/ | zstd -o project-backup.tar.zst

解压时:

Terminal window
zstd -dc project-backup.tar.zst | tar -xf -

其中:

-d 解压
-c 输出到标准输出
-f - 让 tar 从标准输入读取数据

7. 压缩和解压 zip 文件

ZIP 是 Windows、macOS、Linux 之间最通用的压缩格式之一。向 Windows 用户发送项目文件、文档或日志时,通常优先选择 .zip

压缩一个目录:

Terminal window
zip -r project.zip project/

压缩多个文件:

Terminal window
zip archive.zip README.md docker-compose.yml .env.example

排除目录或文件:

Terminal window
zip -r project.zip project/ \
-x 'project/node_modules/*' \
-x 'project/.git/*' \
-x 'project/.venv/*'

查看 ZIP 文件内容:

Terminal window
unzip -l project.zip

解压到当前目录:

Terminal window
unzip project.zip

解压到指定目录:

Terminal window
mkdir -p /tmp/project-restore
unzip project.zip -d /tmp/project-restore

覆盖同名文件,不询问:

Terminal window
unzip -o project.zip

不覆盖已存在文件:

Terminal window
unzip -n project.zip

使用 -o 前要确认目标目录。它会直接覆盖同名文件,容易覆盖现有配置或代码。

8. 处理单文件压缩:gzip、bzip2、xz、zstd

gzipbzip2xzzstd 默认压缩的是单个文件,不会自动把多个文件或目录打包到一起。

压缩单个日志文件:

Terminal window
gzip app.log

执行后会得到:

app.log.gz

解压:

Terminal window
gunzip app.log.gz

保留原文件进行压缩:

Terminal window
gzip -k app.log

查看 .gz 文件内容,不落盘解压:

Terminal window
zcat app.log.gz

查看并筛选日志:

Terminal window
zgrep -n -i 'error' app.log.gz

使用 bzip2:

Terminal window
bzip2 app.log
bunzip2 app.log.bz2

使用 xz:

Terminal window
xz app.log
unxz app.log.xz

使用 zstd:

Terminal window
zstd app.log
zstd -d app.log.zst

压缩文件时保留原文件:

Terminal window
bzip2 -k app.log
xz -k app.log
zstd -k app.log

9. 打包项目时排除无关或敏感内容

备份项目时,不应无差别打包所有文件。常见需要排除的内容包括:

.git
node_modules
.venv
__pycache__
dist
build
.env
secrets
logs
临时备份文件

例如,打包一个 Python + Node.js 项目:

Terminal window
tar -czf project-backup.tar.gz \
--exclude='.git' \
--exclude='node_modules' \
--exclude='.venv' \
--exclude='__pycache__' \
--exclude='dist' \
--exclude='build' \
--exclude='.env' \
project/

如果项目根目录中有多个需要保留的文件,也可以使用 --exclude 精准控制。

例如备份 Docker Compose 项目:

Terminal window
tar -czf compose-project.tar.gz \
--exclude='.git' \
--exclude='.env' \
--exclude='data' \
--exclude='logs' \
docker-compose.yml \
compose.yaml \
nginx/ \
app/

.env、私钥、数据库备份和用户数据可能包含敏感信息。上传压缩包到云盘、GitHub、工单系统或聊天工具前,必须先确认不包含这些内容。

10. 解压未知来源的文件前先检查

从互联网、第三方或陌生服务器下载的压缩包,不建议直接解压到项目目录、家目录或系统目录。

先查看内容:

Terminal window
tar -tzf unknown.tar.gz

或:

Terminal window
unzip -l unknown.zip

然后解压到临时目录:

Terminal window
mkdir -p /tmp/archive-check
tar -xzf unknown.tar.gz -C /tmp/archive-check

或:

Terminal window
mkdir -p /tmp/archive-check
unzip unknown.zip -d /tmp/archive-check

检查文件结构后,再将需要的内容移动到正式位置。

这种做法可以降低以下风险:

  • 误覆盖当前项目文件;
  • 压缩包顶层目录结构不符合预期;
  • 包含不需要的脚本、配置或大量无关文件;
  • 压缩包中存在使用特殊路径的文件名。

11. 常用命令速查

Terminal window
# 创建 .tar.gz
tar -czf archive.tar.gz directory/
# 解压 .tar.gz
tar -xzf archive.tar.gz
# 创建 .tar.xz
tar -cJf archive.tar.xz directory/
# 解压 .tar.xz
tar -xJf archive.tar.xz
# 创建 .tar.bz2
tar -cjf archive.tar.bz2 directory/
# 解压 .tar.bz2
tar -xjf archive.tar.bz2
# 创建 .tar.zst
tar --zstd -cf archive.tar.zst directory/
# 解压 .tar.zst
tar --zstd -xf archive.tar.zst
# 创建 ZIP
zip -r archive.zip directory/
# 解压 ZIP
unzip archive.zip
# 解压到指定目录
tar -xzf archive.tar.gz -C /target/path
unzip archive.zip -d /target/path
# 查看归档内容,不解压
tar -tzf archive.tar.gz
unzip -l archive.zip
# 压缩单个文件
gzip file.log
xz file.log
zstd file.log
# 解压单个文件
gunzip file.log.gz
unxz file.log.xz
zstd -d file.log.zst

常见问题

1. 为什么 tar 参数里有时带连字符,有时没有?

下面两种写法在 GNU tar 中通常都可以:

Terminal window
tar -czf archive.tar.gz directory/
tar czf archive.tar.gz directory/

为了便于阅读和减少歧义,本文统一使用带连字符的写法:

Terminal window
tar -czf archive.tar.gz directory/

2. 解压 tar.gz 时提示 gzip: stdin: not in gzip format 怎么办?

这通常表示文件扩展名与实际格式不一致,或者下载文件不完整。

先识别真实文件类型:

Terminal window
file archive.tar.gz

再根据结果选择命令:

Terminal window
tar -xf archive.tar
tar -xzf archive.tar.gz
tar -xJf archive.tar.xz
unzip archive.zip

不要只根据文件后缀判断格式。

3. 为什么解压后多出一个顶层目录?

这是创建压缩包时的目录结构决定的。

例如:

Terminal window
tar -czf project.tar.gz project/

解压后会得到:

project/

如果执行:

Terminal window
cd project
tar -czf ../project.tar.gz .

解压结构可能会直接散落到当前目录层级。

为了避免覆盖文件,建议压缩项目目录本身,而不是在项目内部打包 .

Terminal window
tar -czf project.tar.gz project/

4. ZIP 文件名乱码怎么办?

ZIP 文件的文件名编码在不同系统之间可能不一致,尤其是来源于旧版 Windows 或旧工具时。

可以先尝试:

Terminal window
unzip -O GBK archive.zip

或:

Terminal window
unzip -O CP936 archive.zip

是否可用取决于系统中的 unzip 版本。对于跨平台传输,尽量使用 UTF-8 文件名,并在 Linux、Windows 上使用较新的压缩工具创建 ZIP 文件。

5. 怎么在不解压的情况下查看压缩日志?

.gz 文件:

Terminal window
zcat app.log.gz
zgrep -n -i 'error' app.log.gz

.xz 文件:

Terminal window
xzcat app.log.xz
xzgrep -n -i 'error' app.log.xz

.zst 文件:

Terminal window
zstdcat app.log.zst
zstdgrep -n -i 'error' app.log.zst

这样可以避免先解压出一个很大的日志文件。

6. 压缩包和备份是不是一回事?

不是。

压缩包解决的是“把文件打包并减少体积”;备份还需要考虑:

备份频率
异地或离线副本
数据校验
恢复演练
保留周期
权限与加密
数据库一致性

例如,只把数据库数据目录打成 .tar.gz,并不一定是可靠的数据库备份。对于 MySQL、PostgreSQL 等服务,通常应优先使用官方逻辑备份工具,再对导出的备份文件压缩。

总结

Linux 压缩与解压最重要的是先识别格式,再选择对应命令。

.tar.gz:日常项目和服务器备份的常用选择
.tar.xz:更高压缩率,适合长期归档
.tar.zst:兼顾速度与压缩率,适合较大文件
.zip:跨 Windows、macOS、Linux 传输时常用
.gz / .xz / .zst:更适合单个文件,例如日志

日常最值得记住的命令:

Terminal window
tar -czf archive.tar.gz directory/
tar -xzf archive.tar.gz
tar -tzf archive.tar.gz
zip -r archive.zip directory/
unzip archive.zip
unzip -l archive.zip
gzip -k app.log
zgrep -n -i 'error' app.log.gz

对于项目和服务器备份,始终先想清楚要排除哪些依赖目录、缓存目录和敏感文件;对于未知来源的压缩包,先查看内容并解压到临时目录再使用。