首页/系统/Linux 运维命令速查/tar 打包与解包(归档核心)
文件与目录76 条

tar 打包与解包(归档核心)

Linux 归档与分发的主角:打包、压缩、查看、选择性解压一条龙,和 gzip/xz/zstd 组合覆盖各类镜像包格式。

Linux 运维命令速查系统更新于 2026-10-13

tar 是什么

tar 把一棵目录树序列化成单一的归档流,名字来自 tape archive(磁带归档)。它本身只做打包不做压缩,压缩交给外部程序:-z 调 gzip、-j 调 bzip2、-J 调 xz、--zstd 调 zstd。因为是流式格式,tar 可以直接写标准输出走管道,也可以边传边解,这是它比 zip 更适合服务器场景的原因;反过来,流式也意味着不能像 zip 那样随机读取单个条目,要取包内某个文件仍得从头扫描。

基本信息

适用平台Linux、macOS、BSD 通用;GNU tar 的 --zstd、--exclude-vcs 等属扩展选项
命令语法tar 主操作选项 [其他选项] -f 包文件 [路径...];主操作 -c 创建、-x 解包、-t 列表、-r 追加、-u 更新
压缩选项-z gzip(.tar.gz)、-j bzip2(.tar.bz2)、-J xz(.tar.xz)、--zstd zstd(.tar.zst)、不加则纯 tar
常用辅助-v 显示过程、-C 切换目录、--exclude 排除、--strip-components 去掉顶层目录、--numeric-owner 按数字记录属主
权限要求打包读取需要源目录的读权限;解包保留属主需要 root,否则还原成当前用户

典型使用场景

  • 站点与数据备份:打包整个目录树再异地保存,--exclude 排除缓存与临时文件
  • 服务发布:把编译产物打包传到目标机器,用 --strip-components 去掉版本号目录后直接铺到部署路径
  • 日志归档:按周期把已轮转的日志打包压缩后删除原文件,控制磁盘占用
  • 源码分发:发行版与开源项目普遍使用 .tar.gz / .tar.xz,配置编译前先解包
  • 跨主机搬运并保留元数据:tar 加管道可以在两台机器之间直接传输,权限与属主信息一并带走
  • 灾难恢复:从备份包中只解出需要的单个文件,先 -t 定位路径再按路径解压

常用示例

常用示例
tar -czvf site-2026-10.tar.gz -C /data site      # 进到父目录再打包,包内是相对路径
tar -tzvf site-2026-10.tar.gz                     # 先列内容确认再解
tar -xzvf site-2026-10.tar.gz -C /restore          # 解到指定目录
tar -czf app.tar.gz --exclude='*/cache/*' --exclude='*.log' app   # 排除规则写在路径之前
tar -xzf big.tar.gz path/in/archive                # 只解压指定路径
tar -xzf app.tar.gz --strip-components=1 -C /opt/app   # 去掉包的顶层目录
tar -rf data.tar newfile.log                       # 向未压缩 tar 追加文件
tar -czf - /data/site | ssh backup@10.0.0.9 'cat > /backup/site.tar.gz'   # 管道直传

压缩格式对照

格式选项取舍
.tar无速度最快、完全不压缩,适合本地快速搬运
.tar.gz-z速度与压缩率均衡,通用性最好,跨平台无障碍
.tar.bz2-j压缩率略高于 gzip 但慢,如今较少使用
.tar.xz-J压缩率最高、CPU 消耗大,发行版源码包常用
.tar.zst--zstd速度与压缩率都优秀,需要较新的 tar 与 zstd 命令
-f 后面的参数就是包文件名,所以选项串习惯写成 tar -czvf 包名 路径,把 f 放在最后。用 -C 先切换目录再打包,可以让包内是相对路径,解压时不产生前导斜杠的警告。
解压第三方包前先 tar -t 列出内容,注意两类风险:包内条目以 / 或 ../ 开头时会覆盖系统路径(GNU tar 默认会剥离前导 /,但仍有隐患),以及所谓 tar 炸弹——一个几 KB 的包解出几十 GB 数据把磁盘撑满。解压时统一加 -C 指定全新空目录。
追加与更新有前提:-r 追加只支持未压缩的 tar 包,压缩包必须先解开再重新打包;-u 更新同样是逐条扫描包内已存在的同名文件,大包上开销不小,增量备份场景更适合用 rsync 或 tar 的 -g 快照文件功能。

路径与权限选项

选项作用场景
-C 目录先切换目录再处理后面的路径控制包内相对路径的根
--strip-components=N解压时去掉前 N 层目录发布包带版本号目录时铺平
--exclude-from=文件从文件读取排除模式排除规则多时便于维护
-P保留绝对路径记录默认会剥离开头的斜杠
-p解包时保留原权限跨机器还原原始权限
--numeric-owner按数字记录或还原属主目标机没有同名账号时
排除规则多的时候写成文件用 --exclude-from 引用,比堆一长串 --exclude 更易维护,规则同样要写在它要作用的路径之前。跨机器还原时配合 --numeric-owner,可避免目标机账号名不同造成属主错乱;需要保持脚本可执行位时别忘了 -p。

易错点

  • -f 不是可选开关而是「下一个参数是包名」,写成 tar -cfzv 包名 会直接报错;稳妥写法是把 f 放在选项串末尾
  • 以绝对路径打包会记录前导 /,解压时报 Removing leading / 警告并改变还原位置;规范做法是先 cd 到父目录用相对路径打包,或统一用 -C
  • --exclude 必须写在它要作用的路径之前,写在路径之后不会生效,这是最常见的排除规则失效原因
  • 先解压再检查是坏习惯:解压前先 tar -t 预览,第三方包还要留意路径穿越条目与解压后体积暴增
  • 追加 -r 只支持未压缩 tar,压缩包追加会失败;压缩包要加内容只能解包、追加、重新压缩
  • -C 指定的解压目标目录必须已存在,tar 不会自动创建,目录缺失时直接报错中止,批量部署脚本里要先 mkdir -p

数据来源与参考

  • man 1 tar(GNU tar 手册)
  • GNU Tar 官方文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌