Linux压缩解压入门:tar、gzip、zip 三个命令一次吃透
【免费下载链接】linux-tutorial:penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial
升级要上了,动手前得把 /var/www 整个目录打成压缩包丢进备份目录;同事发来的源码包却是 .tar.gz,你愣是没拆开。Linux压缩解压看着杂,就是 tar、gzip、zip 三个工具各管一段——linux-tutorial 仓库里攒了不少实战。这篇按"解包→备份→传文件"走一遍,每节只留能直接复制的最小命令集。
概念钥匙:打包和压缩是两码事
先记住一点:打包不等于压缩。
tar 像行李箱,把一堆文件和目录装进一个 .tar 文件,体积一点没变;gzip 像真空袋,把单个文件压成 .gz,体积肉眼可见地缩下去。.tar.gz 就是两者叠加:先 tar 装好,再 gzip 抽气。想明白这一句,两个最常见的困惑就通了:
tar -cvf之后大小没变?只用了行李箱,没用真空袋。- gzip 压不了目录?真空袋一次只能装一个东西,得先让 tar 把目录装进行李箱,再整体压缩。
记混的后果很具体:对目录直接跑 gzip 会报错退出,或者把一堆 .gz 散落一地,到时候一个个还原更累。
🔓 解包场景:.tar、.tar.gz、.tar.bz2 怎么拆
拆包就看后缀:纯 .tar 直接解,.gz 加 -z,.bz2 加 -j。生产环境里我习惯先用 -tvf 列一遍清单再动手,免得文件解错地方:
# 先看包里有什么 tar -tvf source.tar.gz # 纯打包文件 tar -xvf package.tar # gzip 压的包,-z 对应 gzip tar -zxvf source.tar.gz # bzip2 压的包,-j 对应 bzip2 tar -jxvf package.tar.bz2参数拆开看:-t 列清单、-x 解出、-v 显示过程、-f 指定包名。想解到别的路径,在行尾追加 -C /目标/目录 即可。更多组合见仓库里的Linux 文件压缩和解压。
📦 备份场景:Linux目录压缩备份到指定路径
日常把目录备份走,一条 tar 就够。-c 建包、-v 显示过程、-f 定包名,-z 走 gzip,-j 走 bzip2:
# 打包 + gzip,包名带日期戳防覆盖 tar -zcvf /backup/app_$(date +%Y%m%d).tar.gz /var/www/app # 磁盘紧张换 bzip2:压得更小,速度慢一截 tar -jcvf /backup/app_$(date +%Y%m%d).tar.bz2 /var/www/app想精细控制程度,gzip 的级别参数从 1 排到 9,数字越小越快,9 的压缩率最高,默认 6 居中。注意 tar 压缩级别要写在包名后面;另外 gzip 直接压会吃掉原文件,想留原件就用 -c 把结果导出去:
# -1 求快,-9 求小 gzip -1 quick.log gzip -9 archive.log # tar 调 gzip:级别参数跟在包名后 tar -zcvf fast_backup.tar.gz -1 /data/logs # 保留原文件:结果写入新文件 gzip -c big.log > big.log.gz # 解压:-d 或 gunzip 二选一 gunzip big.log.gz顺带一句,-C 还能改变包内路径基准:tar -zcvf /backup/x.tar.gz -C /var/www app,包内不再带全盘绝对路径,换机器恢复时更灵活。
📤 跨平台场景:zip 打包、排除文件、解压到指定目录
给 Windows 同事发文件,用 zip 最省事。两个参数最高频:-r 递归进目录,-x 排除不要的东西——日志和临时文件挡在外面,包体干净还小一号:
# 递归打目录,顺带排除日志和临时文件 zip -r project.zip src/ docs/ -x "*.log" "*.tmp" # 对方解压到指定目录;-o 表示同名直接覆盖 unzip project.zip -d /tmp/recv/ # 不拆包先看清单;大文件传完先验完整性 unzip -l project.zip unzip -t project.zipzip 默认会逐个列出文件名,嫌吵就加 -q 安静处理。目录大到超过介质限制时,分卷打,每个卷 100MB,收包方用同一条命令合回去:
# 分卷:生成 project.zip.001、.002…… zip -s 100m -r project.zip /data/big/ # 合并:把分卷并回一个完整包 zip -s 0 -r project.zip project.zip.001🧰 实战脚本:网站备份 + 自动保留最近 10 份
这个脚本干两件事:打一份带时间戳的备份,再把超出最近 10 份的旧备份删掉,存好丢进 crontab 就能长期跑:
#!/bin/bash # 备份站点目录,自动清理,只留最近 10 份 SRC=/var/www/site DIR=/backup F="site_$(date +%Y%m%d_%H%M).tar.gz" tar -zcvf "$DIR/$F" "$SRC" ls -t "$DIR"/site_*.tar.gz | tail -n +11 | xargs -r rm -f -- echo "backup done: $DIR/$F"清理逻辑拆开看:ls -t按时间从新到旧排,tail -n +11取第 11 份往后,xargs -r保证列表为空时什么都不做,避免误删。仓库里还有一个同类案例,系统快照报告脚本 也是拿 tar 把系统关键信息打包归档的。
⚡ 常见坑:.tar.xz、认不出的格式、赶时间
包是 .tar.xz。那是 xz 压的,参数是大写 -J,别和小写 -j(bzip2)搞混:
# xz 压缩包,注意大写 tar -Jxvf package.tar.xz后缀见所未见,不知道是什么。先用 file 命令问它真实身份,再决定用什么拆:
file mystery.bin赶时间,速度优先。把级别降到 1 就行:gzip -1、zip -r -1,或 tar 包名后追加 -1。同一份数据,1 级和 9 级的耗时能差出几倍,空间紧张才值得上 9。
命令速查表
| 需求 | 命令 |
|---|---|
| 打包不压缩 | tar -cvf pack.tar dir/ |
| 打包 + gzip | tar -zcvf pack.tar.gz dir/ |
| 打包 + bzip2 | tar -jcvf pack.tar.bz2 dir/ |
| 解 .tar.gz | tar -zxvf pack.tar.gz |
| 解 .tar.bz2 | tar -jxvf pack.tar.bz2 |
| 解 .tar.xz | tar -Jxvf pack.tar.xz |
| 只看包内清单 | tar -tvf pack.tar.gz |
| 解压到指定目录 | tar -zxvf pack.tar.gz -C /tmp/out/ |
| gzip 保留原文件 | gzip -c a.txt > a.txt.gz |
| 解压 gz | gunzip a.txt.gz |
| zip 递归 + 排除文件 | zip -r a.zip dir/ -x "*.log" |
| zip 解压到指定目录 | unzip a.zip -d /tmp/out/ |
| zip 完整性测试 | unzip -t a.zip |
把"打包"和"压缩"分开理解之后,参数其实不用死记:看后缀选工具,-z/-j/-J 对号入座就行。更细的参数组合和边界情况,可以翻 linux-tutorial 仓库的Linux 命令大全继续练手。
【免费下载链接】linux-tutorial:penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考