tar · Linux 打包机
上游:unzip(先学 .zip,再学 Linux 原生格式)· ls(查看 .tar.gz 文件) 下游:find(找到解包的文件)· chmod(解包后设权限)· wget(下载 .tar.gz) 参见:apt(apt 的软件包底层就是 .tar.gz 格式)
一句话是什么
tar 是 Linux 的原生打包工具——把很多文件打成一个包,
或者解开一个包。.tar.gz 是 Linux 世界最常见的压缩格式。
为什么需要它
.zip 是 Windows 发明的,.tar.gz 是 Linux 的老家格式。
在 Linux 世界,几乎所有软件的源代码、服务器程序都是 .tar.gz 格式:
python-3.12.tar.gz
nginx-1.26.tar.gz
node-v20.tar.gz
.tar.gz 其实是两步:
tar = 把多个文件打成一个包(像把很多东西装进一个箱子)
gz = 用 gzip 压缩(像把箱子用真空袋压扁)
所以 tar 既能打包,也能解包,还能顺便压缩。
核心用法
解包(最常用)
# 解压 .tar.gz 文件
tar -xzf 文件.tar.gz
# 解压到指定目录
tar -xzf 文件.tar.gz -C ~/目标目录/
# 先看看里面有什么(不解压)
tar -tzf 文件.tar.gz打包(备份时用)
# 把目录打包成 .tar.gz
tar -czf 备份.tar.gz 目录/
# 把多个文件打包
tar -czf 备份.tar.gz 文件1 文件2 文件3参数速记表
| 参数 | 含义 | 记法 |
|---|---|---|
-x | extract(解包) | extract |
-c | create(创建包) | create |
-z | gzip(压缩/解压) | gzip |
-f | file(指定文件名) | file |
-t | list(列出内容) | list |
-v | verbose(显示过程) | verbose |
-C | 指定目标目录 | Change directory |
记忆口诀
解包:tar -xzf → "x 是解,z 是 gz,f 是文件"
打包:tar -czf → "c 是创建,z 是压缩,f 是文件"
查看:tar -tzf → "t 是列表"
拟人化拆解 · c/x/v/z/f 五个字母到底各做什么
tar -cvzf backup.tar.gz worlds/ 看起来像乱码,
实际上是五个独立的”工人开关”,每个开关控制一个具体动作。一个一个拆开看。
五个核心字母
| 字母 | 全名 | 拟人化行为 |
|---|---|---|
c | create | ”新建一个箱子,从空开始往里装”——打包 |
x | extract | ”撬开一个箱子,把东西摆回房间”——解包 |
t | list | ”不开箱,只看箱子上贴的清单”——查看内容 |
v | verbose | ”工人边干边念叨:装了 file1、装了 file2…”——显示进度 |
z | gzip | ”在箱子外面套一层真空压缩袋”——加 gzip 压缩 |
j | bjip2 | ”套更紧的压缩袋(更慢但更小)“——加 bzip2 压缩 |
f | file | ”给箱子贴个标签:叫什么名字”——指定文件名(必加) |
c、x、t 三选一——同一次只能做一件事,要么打包、要么解包、要么看清单。
拼装规则:c/x/t 选一个 + f 必选 + 其他可选
# 打包(最简版)
tar -cf backup.tar worlds/
# c:建箱子 + f:箱子叫 backup.tar,把 worlds/ 装进去
# 打包 + 看进度 + gzip 压缩
tar -cvzf backup.tar.gz worlds/
# c+v+z+f:建箱子 + 念叨 + 套压缩袋 + 起名 backup.tar.gz
# 解包
tar -xvzf backup.tar.gz
# x+v+z+f:撬开 + 念叨 + 解压缩袋 + 用名字找箱子
# 不解包,只看里面有什么
tar -tzf backup.tar.gz
# t+z+f:看清单 + 解压缩袋 + 用名字找箱子为什么 f 总是放最后
-f 后面必须紧跟文件名,所以习惯把它放参数串末尾,文件名直接跟在后面:
tar -czf backup.tar.gz worlds/ # ✅ 清晰
tar -fcz backup.tar.gz worlds/ # 能跑但绕:tar 会以为 backup.tar.gz 是 c 的参数文件后缀的”暗语”——靠后缀认压缩格式
| 后缀 | 是什么 | 用什么参数解 |
|---|---|---|
.tar | 纯打包,不压缩 | tar -xf |
.tar.gz 或 .tgz | tar + gzip | tar -xzf |
.tar.bz2 | tar + bzip2(更小但更慢) | tar -xjf |
.tar.xz | tar + xz(最小但最慢) | tar -xJf(大写 J) |
记忆诀窍:看后缀认参数。.gz → z;.bz2 → j;.xz → J。
现代 tar 的偷懒选项 · -a 自动识别
新版 tar 加了 -a(auto),它会根据文件名后缀自动选压缩方式:
tar -cavf my.tar.gz worlds/ # 看到 .gz,自动用 gzip
tar -cavf my.tar.xz worlds/ # 看到 .xz,自动用 xz解包时新版 tar 也能自动识别压缩格式:tar -xf 任何后缀.tar.* 通常都能解开。
Aaron 常见踩坑
坑 1 · 忘了 f 直接给文件名
tar -czv backup.tar.gz worlds/
# tar: backup.tar.gz: Cannot stat: No such file or directory
# 没加 f,tar 不知道 backup.tar.gz 是输出文件名,反而当成要打包的源文件去找坑 2 · 解包到当前目录,文件散一地
# 不安全:把 .tar.gz 里所有文件直接铺到当前目录
tar -xzf bedrock-server.tar.gz
# 安全做法:先建独立目录,用 -C 指定解压位置
mkdir mc-server
tar -xzf bedrock-server.tar.gz -C mc-server/-C 目录 = “Change directory”——解包前先 cd 进那个目录再开干。
例题精讲
📗 初探 Starter — 解压一个软件包
任务:下载 Python 源代码包(小文件),解压看看里面是什么。
# 第一步:创建一个测试 .tar.gz 练手
mkdir -p ~/练习/tar-test/原始
echo "文件A内容" > ~/练习/tar-test/原始/fileA.txt
echo "文件B内容" > ~/练习/tar-test/原始/fileB.txt
# 打包
tar -czf ~/练习/tar-test/测试包.tar.gz -C ~/练习/tar-test/ 原始/
# 第二步:先看看里面有什么(不解压)
tar -tzf ~/练习/tar-test/测试包.tar.gz
# 输出:
# 原始/
# 原始/fileA.txt
# 原始/fileB.txt
# 第三步:解压到新目录
mkdir -p ~/练习/tar-test/解压结果
tar -xzf ~/练习/tar-test/测试包.tar.gz -C ~/练习/tar-test/解压结果/
# 第四步:确认
ls ~/练习/tar-test/解压结果/
# 原始/你学到了什么:-t 先看,-x 再解,-C 指定目录。
📘 应用 User — 备份学习笔记
任务:把自己的学习基地打成一个备份包,方便发给爸爸。
# 第一步:查看学习基地大小
du -sh ~/学习基地/
# 示例:4.0M 学习基地/
# 第二步:打成 tar.gz 备份包(文件名包含日期)
tar -czf ~/备份-学习基地-$(date +%Y%m%d).tar.gz ~/学习基地/
# 确认备份文件存在
ls -lh ~/备份-学习基地-*.tar.gz
# -rw-r--r-- 1 aaron aaron 1.2M Apr 20 备份-学习基地-20260420.tar.gz
# 第三步:验证备份内容(不解压,只查看)
tar -tzf ~/备份-学习基地-20260420.tar.gz | head -10
# 第四步:测试恢复(解压到临时目录)
mkdir -p /tmp/恢复测试
tar -xzf ~/备份-学习基地-20260420.tar.gz -C /tmp/恢复测试/
ls /tmp/恢复测试/你学到了什么:$(date +%Y%m%d) 是 shell 命令替换,
自动把当前日期插入文件名——备份文件名里有日期,以后找起来方便。
📙 管理 Admin — 安装从官网下载的软件
任务:从官网下载一个 .tar.gz 格式的软件,解压并安装。
# 以 Node.js 为例(LTS 版本)
# 下载(用 wget 或 curl)
wget https://nodejs.org/dist/v20.11.0/node-v20.11.0-linux-x64.tar.gz
# 第一步:看看压缩包里有什么
tar -tzf node-v20.11.0-linux-x64.tar.gz | head -5
# node-v20.11.0-linux-x64/
# node-v20.11.0-linux-x64/bin/
# node-v20.11.0-linux-x64/bin/node
# node-v20.11.0-linux-x64/bin/npm
# 第二步:解压到 /usr/local/(系统软件目录)
sudo tar -xzf node-v20.11.0-linux-x64.tar.gz -C /usr/local/ --strip-components=1
# --strip-components=1 = 去掉外层目录名
# 不用 --strip,解压出来是 /usr/local/node-v20.11.0-linux-x64/bin/node
# 用了 --strip-components=1,解压出来是 /usr/local/bin/node ← 更整洁
# 第三步:验证
node --version
# v20.11.0你学到了什么:--strip-components=1 是个高级技巧,
去掉压缩包外层的目录名,直接把内容解压到目标位置。
官方文档参考
man tar # 完整手册
tar --help # 快速选项列表
tar= Tape ARchive;打包(-c)和解包(-x)是两个独立动作,-z追加 gzip 压缩。 在线:https://manpages.ubuntu.com/tar
节点链接
上游(先会这些,再来学 tar)
同层(文件操作工具集)
- unzip ← .zip ↔ .tar.gz,两种格式都要会
下游(解包之后)
进阶理解
- apt ← apt 的 .deb 包底层就是 tar 格式包裹起来的