系列:Linux 命令基础
- Tmux 入门教程:让 SSH 断线和多任务终端不再中断
- Tree 命令教程:快速查看和导出目录结构
- Linux 搜索命令教程:find、grep、locate、rg 应该怎么选
- Linux 压缩与解压命令教程:tar、zip、gzip、xz、zstd 一次讲清
- Linux 文本处理命令教程:cat、less、head、tail、wc、sort、uniq
- Linux 权限命令教程:chmod、chown、umask
- Linux 进程查看与管理:ps、top、htop、kill、jobs
- Linux 网络排查命令:ss、curl、dig、ping、traceroute
- systemctl 与 journalctl 入门:管理服务和查看日志
- rsync 使用指南:服务器文件同步与备份
- Linux 服务器安全基础:SSH、用户权限、防火墙和 fail2ban
- 线上问题排查流程:日志、端口、进程、磁盘、网络怎么一步步看
- 深入浅出:Linux 树状目录神器 tree 命令的安装与使用指南
- Linux 系统 Vim 编辑器终极指南:从入门到精通
- SSH 隧道实战:本地转发、远程转发和动态转发
- 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 发行版默认已经包含 tar 和 gzip。如果需要处理 ZIP、XZ、Zstandard 等格式,可以安装以下工具:
sudo apt updatesudo apt install -y zip unzip gzip bzip2 xz-utils zstd确认命令是否可用:
tar --versiongzip --versionzip -vunzip -vxz --versionzstd --version常见工具对应关系:
tar 打包、解包 .tar / .tar.gz / .tar.xz 等归档gzip 压缩、解压 .gzbzip2 压缩、解压 .bz2xz 压缩、解压 .xzzstd 压缩、解压 .zstzip 创建 .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:显示过程例如:
tar -czf backup.tar.gz project/可以拆解为:
c:创建归档z:使用 gzip 压缩f:后面跟归档文件名backup.tar.gz:输出文件名project/:要打包的目录3. 创建和解压 tar.gz 文件
.tar.gz 或 .tgz 是 Linux 服务器中最常见的压缩格式,适合代码、日志、配置目录和备份文件。
创建压缩包:
tar -czf project-backup.tar.gz project/创建时显示详细过程:
tar -czvf project-backup.tar.gz project/解压到当前目录:
tar -xzf project-backup.tar.gz解压时显示详细过程:
tar -xzvf project-backup.tar.gz解压到指定目录:
mkdir -p /tmp/project-restoretar -xzf project-backup.tar.gz -C /tmp/project-restore只查看压缩包内容,不解压:
tar -tzf project-backup.tar.gz只查看前 30 行:
tar -tzf project-backup.tar.gz | head -n 304. 创建和解压 tar.xz 文件
.tar.xz 通常适合需要更高压缩率的源码包、长期归档和离线备份。
创建 .tar.xz 文件:
tar -cJf project-backup.tar.xz project/解压:
tar -xJf project-backup.tar.xz解压到指定目录:
mkdir -p /tmp/project-restoretar -xJf project-backup.tar.xz -C /tmp/project-restore查看内容:
tar -tJf project-backup.tar.xz.tar.xz 通常比 .tar.gz 更小,但压缩和解压耗时可能更长。日常快速备份常用 .tar.gz;追求更小文件体积的长期归档可考虑 .tar.xz。
5. 创建和解压 tar.bz2 文件
.tar.bz2 是较常见的传统压缩格式,部分旧软件源码包仍会使用。
创建:
tar -cjf project-backup.tar.bz2 project/解压:
tar -xjf project-backup.tar.bz2查看内容:
tar -tjf project-backup.tar.bz2日常新项目一般优先使用 .tar.gz、.tar.xz 或 .tar.zst。遇到 .tar.bz2 文件时,直接按上面的方式解压即可。
6. 使用 zstd 创建和解压 tar.zst 文件
Zstandard,常用命令为 zstd,兼顾压缩速度和压缩率,适合较大的备份文件和频繁的压缩任务。
创建 .tar.zst:
tar --zstd -cf project-backup.tar.zst project/解压:
tar --zstd -xf project-backup.tar.zst查看归档内容:
tar --zstd -tf project-backup.tar.zst如果系统的 tar 不支持 --zstd,可以拆为两步:
tar -cf - project/ | zstd -o project-backup.tar.zst解压时:
zstd -dc project-backup.tar.zst | tar -xf -其中:
-d 解压-c 输出到标准输出-f - 让 tar 从标准输入读取数据7. 压缩和解压 zip 文件
ZIP 是 Windows、macOS、Linux 之间最通用的压缩格式之一。向 Windows 用户发送项目文件、文档或日志时,通常优先选择 .zip。
压缩一个目录:
zip -r project.zip project/压缩多个文件:
zip archive.zip README.md docker-compose.yml .env.example排除目录或文件:
zip -r project.zip project/ \ -x 'project/node_modules/*' \ -x 'project/.git/*' \ -x 'project/.venv/*'查看 ZIP 文件内容:
unzip -l project.zip解压到当前目录:
unzip project.zip解压到指定目录:
mkdir -p /tmp/project-restoreunzip project.zip -d /tmp/project-restore覆盖同名文件,不询问:
unzip -o project.zip不覆盖已存在文件:
unzip -n project.zip使用
-o前要确认目标目录。它会直接覆盖同名文件,容易覆盖现有配置或代码。
8. 处理单文件压缩:gzip、bzip2、xz、zstd
gzip、bzip2、xz 和 zstd 默认压缩的是单个文件,不会自动把多个文件或目录打包到一起。
压缩单个日志文件:
gzip app.log执行后会得到:
app.log.gz解压:
gunzip app.log.gz保留原文件进行压缩:
gzip -k app.log查看 .gz 文件内容,不落盘解压:
zcat app.log.gz查看并筛选日志:
zgrep -n -i 'error' app.log.gz使用 bzip2:
bzip2 app.logbunzip2 app.log.bz2使用 xz:
xz app.logunxz app.log.xz使用 zstd:
zstd app.logzstd -d app.log.zst压缩文件时保留原文件:
bzip2 -k app.logxz -k app.logzstd -k app.log9. 打包项目时排除无关或敏感内容
备份项目时,不应无差别打包所有文件。常见需要排除的内容包括:
.gitnode_modules.venv__pycache__distbuild.envsecretslogs临时备份文件例如,打包一个 Python + Node.js 项目:
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 项目:
tar -czf compose-project.tar.gz \ --exclude='.git' \ --exclude='.env' \ --exclude='data' \ --exclude='logs' \ docker-compose.yml \ compose.yaml \ nginx/ \ app/
.env、私钥、数据库备份和用户数据可能包含敏感信息。上传压缩包到云盘、GitHub、工单系统或聊天工具前,必须先确认不包含这些内容。
10. 解压未知来源的文件前先检查
从互联网、第三方或陌生服务器下载的压缩包,不建议直接解压到项目目录、家目录或系统目录。
先查看内容:
tar -tzf unknown.tar.gz或:
unzip -l unknown.zip然后解压到临时目录:
mkdir -p /tmp/archive-checktar -xzf unknown.tar.gz -C /tmp/archive-check或:
mkdir -p /tmp/archive-checkunzip unknown.zip -d /tmp/archive-check检查文件结构后,再将需要的内容移动到正式位置。
这种做法可以降低以下风险:
- 误覆盖当前项目文件;
- 压缩包顶层目录结构不符合预期;
- 包含不需要的脚本、配置或大量无关文件;
- 压缩包中存在使用特殊路径的文件名。
11. 常用命令速查
# 创建 .tar.gztar -czf archive.tar.gz directory/
# 解压 .tar.gztar -xzf archive.tar.gz
# 创建 .tar.xztar -cJf archive.tar.xz directory/
# 解压 .tar.xztar -xJf archive.tar.xz
# 创建 .tar.bz2tar -cjf archive.tar.bz2 directory/
# 解压 .tar.bz2tar -xjf archive.tar.bz2
# 创建 .tar.zsttar --zstd -cf archive.tar.zst directory/
# 解压 .tar.zsttar --zstd -xf archive.tar.zst
# 创建 ZIPzip -r archive.zip directory/
# 解压 ZIPunzip archive.zip
# 解压到指定目录tar -xzf archive.tar.gz -C /target/pathunzip archive.zip -d /target/path
# 查看归档内容,不解压tar -tzf archive.tar.gzunzip -l archive.zip
# 压缩单个文件gzip file.logxz file.logzstd file.log
# 解压单个文件gunzip file.log.gzunxz file.log.xzzstd -d file.log.zst常见问题
1. 为什么 tar 参数里有时带连字符,有时没有?
下面两种写法在 GNU tar 中通常都可以:
tar -czf archive.tar.gz directory/tar czf archive.tar.gz directory/为了便于阅读和减少歧义,本文统一使用带连字符的写法:
tar -czf archive.tar.gz directory/2. 解压 tar.gz 时提示 gzip: stdin: not in gzip format 怎么办?
这通常表示文件扩展名与实际格式不一致,或者下载文件不完整。
先识别真实文件类型:
file archive.tar.gz再根据结果选择命令:
tar -xf archive.tartar -xzf archive.tar.gztar -xJf archive.tar.xzunzip archive.zip不要只根据文件后缀判断格式。
3. 为什么解压后多出一个顶层目录?
这是创建压缩包时的目录结构决定的。
例如:
tar -czf project.tar.gz project/解压后会得到:
project/如果执行:
cd projecttar -czf ../project.tar.gz .解压结构可能会直接散落到当前目录层级。
为了避免覆盖文件,建议压缩项目目录本身,而不是在项目内部打包 .:
tar -czf project.tar.gz project/4. ZIP 文件名乱码怎么办?
ZIP 文件的文件名编码在不同系统之间可能不一致,尤其是来源于旧版 Windows 或旧工具时。
可以先尝试:
unzip -O GBK archive.zip或:
unzip -O CP936 archive.zip是否可用取决于系统中的 unzip 版本。对于跨平台传输,尽量使用 UTF-8 文件名,并在 Linux、Windows 上使用较新的压缩工具创建 ZIP 文件。
5. 怎么在不解压的情况下查看压缩日志?
.gz 文件:
zcat app.log.gzzgrep -n -i 'error' app.log.gz.xz 文件:
xzcat app.log.xzxzgrep -n -i 'error' app.log.xz.zst 文件:
zstdcat app.log.zstzstdgrep -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:更适合单个文件,例如日志日常最值得记住的命令:
tar -czf archive.tar.gz directory/tar -xzf archive.tar.gztar -tzf archive.tar.gz
zip -r archive.zip directory/unzip archive.zipunzip -l archive.zip
gzip -k app.logzgrep -n -i 'error' app.log.gz对于项目和服务器备份,始终先想清楚要排除哪些依赖目录、缓存目录和敏感文件;对于未知来源的压缩包,先查看内容并解压到临时目录再使用。