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。