Linux Linuxtar运维

tar 命令速查:压缩与解压

| 9 分钟阅读 | --

适用范围: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 取代

四、解压速查

文件类型命令
.tartar -xvf file.tar
.gzgzip -d file.gzgunzip file.gz
.tar.gz / .tgztar -xzvf file.tar.gz
.bz2bzip2 -d file.bz2bunzip2 file.bz2
.tar.bz2tar -xjvf file.tar.bz2
.tar.Ztar -xZvf file.tar.Z
.tar.xztar -xJvf file.tar.xz
.rarunrar e file.rar
.zipunzip file.zip

.tar.Z 的现代替代:多数发行版已不预装 compressgzip -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/

七、易踩的坑

  1. -f 位置-f 必须在参数串最后,其后紧跟文件名。tar -zxfv file.tar.gz 会把 v 当成文件名,报错。
  2. 路径穿越:解第三方 tar 包前先用 tar -tf 看一眼,避免包内含 ../ 或绝对路径成员覆盖系统文件。GNU tar 可用 --absolute-names 之外默认会剥掉开头的 /
  3. 软链接:默认打包的是链接本身;加 -h 会跟随链接打包实际文件。
  4. 中文文件名乱码:跨平台打包时指定 --format=pax--format=ustar 之外的编码处理,或使用 convmv 转码。
  5. 权限丢失:需要完整还原权限/属主时用 tar -xzpf,且解包用户最好为 root。
  6. 参数省略: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 永远在最后。