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

参数速记表

参数含义记法
-xextract(解包)extract
-ccreate(创建包)create
-zgzip(压缩/解压)gzip
-ffile(指定文件名)file
-tlist(列出内容)list
-vverbose(显示过程)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/ 看起来像乱码, 实际上是五个独立的”工人开关”,每个开关控制一个具体动作。一个一个拆开看。

五个核心字母

字母全名拟人化行为
ccreate”新建一个箱子,从空开始往里装”——打包
xextract”撬开一个箱子,把东西摆回房间”——解包
tlist”不开箱,只看箱子上贴的清单”——查看内容
vverbose”工人边干边念叨:装了 file1、装了 file2…”——显示进度
zgzip”在箱子外面套一层真空压缩袋”——加 gzip 压缩
jbjip2”套更紧的压缩袋(更慢但更小)“——加 bzip2 压缩
ffile”给箱子贴个标签:叫什么名字”——指定文件名(必加

cxt 三选一——同一次只能做一件事,要么打包、要么解包、要么看清单。

拼装规则: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.tgztar + gziptar -xzf
.tar.bz2tar + bzip2(更小但更慢)tar -xjf
.tar.xztar + xz(最小但最慢)tar -xJf大写 J

记忆诀窍:看后缀认参数。.gzz.bz2j.xzJ

现代 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 是 Linux 版的 unzip
  • ls ← 找到 .tar.gz 文件的位置
  • cd ← 进入目标目录
  • wget ← 下载 .tar.gz 文件

同层(文件操作工具集)

  • unzip ← .zip ↔ .tar.gz,两种格式都要会

下游(解包之后)

  • find ← 找到解包出来的文件
  • chmod ← 给解包的可执行程序设权限

进阶理解

  • apt ← apt 的 .deb 包底层就是 tar 格式包裹起来的

节点版本:v1.0 · 2026-04-20 下一个节点建议:findchmod