tar 命令速查:压缩与解压
适用范围:Linux / macOS 终端。GNU tar 与 macOS 自带的 bsdtar 在常用参数上一致,差异见文末。
一、核心结构
tar [主命令] [可选参数] -f 归档文件名 [要处理的文件/目录]
三类参数各司其职:
| 类别 | 参数 | 说明 |
|---|---|---|
| 主命令(五选一,必须且只能用其中一个) | -c | 建立归档(create) |
-x | 解出归档(extract) | |
-t | 查看归档内容(list) | |
-r | 向归档末尾追加文件(append) | |
-u | 更新归档中已存在的文件(update) | |
| 可选参数(按需叠加) | -z | 使用 gzip 压缩/解压(.gz) |
-j | 使用 bzip2 压缩/解压(.bz2) | |
-J | 使用 xz 压缩/解压(.xz) | |
-Z | 使用 compress 压缩/解压(.Z) | |
-v | 显示处理过程(verbose) | |
-O | 把文件解到标准输出,不落盘 | |
| 必选参数 | -f | 指定归档文件名,必须是最后一个参数,后面只能接文件名 |
关键点:
-c -x -t -r -u互斥,一次只能用一个,但可以和-z/-j/-v等连用。-f后面紧跟归档名,写成tar -cf all.tar *.jpg而不是tar -fc *.jpg all.tar。- 不带
-z/-j/-J/-Z时,tar 只做打包不压缩,产物就是.tar。
二、打包与追加
tar -cf all.tar *.jpg # 把所有 .jpg 打成一个 all.tar 包
tar -rf all.tar *.gif # 向 all.tar 末尾追加所有 .gif
tar -uf all.tar logo.gif # 用新的 logo.gif 更新包里的同名文件
tar -tf all.tar # 列出包内所有文件
tar -xf all.tar # 解出包内所有文件
注意:-r / -u 只能用于未压缩的 .tar,对 .tar.gz、.tar.bz2 无效。
三、压缩:打包 + 压缩一步完成
tar -cf jpg.tar *.jpg # 仅打包,不压缩
tar -czf jpg.tar.gz *.jpg # 打包后用 gzip 压缩
tar -cjf jpg.tar.bz2 *.jpg # 打包后用 bzip2 压缩
tar -cZf jpg.tar.Z *.jpg # 打包后用 compress 压缩
tar -cJf jpg.tar.xz *.jpg # 打包后用 xz 压缩(压缩率最高)
rar a jpg.rar *.jpg # rar,需先安装 rar for linux
zip jpg.zip *.jpg # zip,需先安装 zip
压缩方式对比:
| 格式 | 参数 | 压缩率 | 速度 | 备注 |
|---|---|---|---|---|
.tar | 无 | 不压缩 | 最快 | 只归并文件,体积不减 |
.tar.gz | -z | 中 | 快 | 最通用,几乎所有环境都支持 |
.tar.bz2 | -j | 较高 | 较慢 | 比 gzip 小,CPU 开销更大 |
.tar.xz | -J | 最高 | 最慢 | 适合分发归档,不适合频繁打包 |
.tar.Z | -Z | 低 | 快 | 老式 compress,基本被 gzip 取代 |
四、解压速查
| 文件类型 | 命令 |
|---|---|
.tar | tar -xvf file.tar |
.gz | gzip -d file.gz 或 gunzip file.gz |
.tar.gz / .tgz | tar -xzvf file.tar.gz |
.bz2 | bzip2 -d file.bz2 或 bunzip2 file.bz2 |
.tar.bz2 | tar -xjvf file.tar.bz2 |
.tar.Z | tar -xZvf file.tar.Z |
.tar.xz | tar -xJvf file.tar.xz |
.rar | unrar e file.rar |
.zip | unzip file.zip |
.tar.Z 的现代替代:多数发行版已不预装 compress,gzip -d file.tar.Z 同样能解开 .Z 文件。
五、实用补充参数
| 参数 | 作用 | 示例 |
|---|---|---|
-C <目录> | 解压到指定目录(目录需已存在) | tar -xzf file.tar.gz -C /opt/app |
--strip-components=N | 解压时去掉前 N 层目录 | tar -xzf file.tar.gz --strip-components=1 |
--exclude=<模式> | 打包时排除文件 | tar -czf src.tar.gz --exclude=node_modules src/ |
-p | 保留原文件权限(解包时常用) | tar -xzpf file.tar.gz |
-O | 输出到 stdout,配合管道用 | tar -xzOf file.tar.gz a.txt | head |
--wildcards | 配合 -t/-x 使用通配符 | tar -tf a.tar --wildcards '*.log' |
--remove-files | 打包成功后删除源文件 | tar -czf log.tar.gz --remove-files *.log |
--listed-incremental | 增量备份快照 | tar -czf bak.tar.gz -g snap.file data/ |
六、常见用法
查看包内容而不解压
tar -tvf file.tar.gz # 列出文件名、大小、时间、权限
tar -tzf file.tar.gz | wc -l # 统计包内文件数量
只解出包里的某个文件
tar -xzf file.tar.gz path/to/one.txt
不落盘查看包内文本文件内容
tar -xzOf file.tar.gz path/to/one.txt
分卷打包与合并解压
tar -czf - bigdir/ | split -b 100m - bigdir.tar.gz.
cat bigdir.tar.gz.* | tar -xzf -
打包时排除版本控制与依赖目录
tar -czf proj.tar.gz --exclude=.git --exclude=node_modules proj/
七、易踩的坑
-f位置:-f必须在参数串最后,其后紧跟文件名。tar -zxfv file.tar.gz会把v当成文件名,报错。- 路径穿越:解第三方 tar 包前先用
tar -tf看一眼,避免包内含../或绝对路径成员覆盖系统文件。GNU tar 可用--absolute-names之外默认会剥掉开头的/。 - 软链接:默认打包的是链接本身;加
-h会跟随链接打包实际文件。 - 中文文件名乱码:跨平台打包时指定
--format=pax与--format=ustar之外的编码处理,或使用convmv转码。 - 权限丢失:需要完整还原权限/属主时用
tar -xzpf,且解包用户最好为 root。 - 参数省略:GNU tar 支持省略前导
-(tar xzf x.tar.gz),脚本里建议保留-,可读性更好。
八、GNU tar 与 macOS bsdtar 差异
| 场景 | GNU tar(Linux) | bsdtar(macOS) |
|---|---|---|
| 自动识别压缩格式 | 支持,tar -xf 可直接解 .tar.gz/.tar.bz2/.tar.xz | 同样支持 |
| 默认归档格式 | GNU 格式 | pax 格式,--format=pax 默认值不同 |
--exclude | 支持 | 支持,但常需配合 --exclude=pattern 完整写法 |
| 安装 GNU 版本 | 自带 | brew install gnu-tar,命令为 gtar |
在 macOS 上打给 Linux 用的包,建议显式加 --format=gnutar 以避免扩展属性(AppleDouble ._* 文件)带来的差异。
九、速记
- 打包:
tar -cf - 打 gzip 包:
tar -czf - 解一切:
tar -xf(GNU/bsd 均可自动识别) - 看内容:
tar -tf - 指定目录:
-C - 记住一句话:主命令五选一,
-f永远在最后。