Linux 体系中的 .tar 压缩与解压详解

[复制链接]
发表于 2026-10-4 19:22:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

在 Linux 里,.tar 是使用频率最高的归档格式。它的特点很明确:只负责把多个文件和目录打包成一个文件,本身不做压缩,压缩是交给 gzip、bzip2、xz 这些工具完成的。理解这一点,后面所有参数就不会记串了。本文从打包、三种压缩格式、解压、只取部分文件、管道用法到完整性校验,把常见操作一次讲全。

一、先搞清楚 .tar 与 .tar.gz 的区别

.tar 是 tape archive 的缩写,最早是给磁带备份设计的工具,现在主要用来把多个文件打包成一个文件便于传输。它自己不压缩,后缀为 .gz、.bz2、.xz 的文件其实是“tar 包 + 压缩算法”的产物:

  • .tar.gz:先用 tar 打包,再用 gzip 压缩
  • .tar.bz2:先用 tar 打包,再用 bzip2 压缩
  • .tar.xz:先用 tar 打包,再用 xz 压缩

实际使用里, Rocky Linux 的 ISO 用的就是 xz 压缩,空间节省很明显,代价是压缩和解压都更慢。

二、确认压缩工具已安装

常见发行版默认就带,不放心可以手动确认并安装:

# Ubuntu / Debian 系列
sudo apt update
sudo apt install tar gzip bzip2 xz-utils

# CentOS / Fedora 系列
sudo yum install tar gzip bzip2 xz

# Arch Linux 系列
sudo pacman -S gzip bzip2 xz
# 看某个工具在不在
which gzip bzip2 xz

三、打包:只归档不压缩

-c 表示创建归档(create),-v 显示过程文件名(verbose),-f 指定归档文件名(file)。这三项是最核心的。

1. 打包单个文件

tar -cvf archive.tar example.txt

把 example.txt 打成 archive.tar,不压缩。

2. 打包多个文件

tar -cvf archive.tar file1.txt file2.txt file3.txt

3. 打包整个目录(含子目录)

tar -cvf backup.tar /path/to/directory

注意路径写法:写成 /path/to/directory 时,解压出来会带上完整目录结构;只想拿目录里的内容、不要这层壳,可以写 /path/to/directory/。

四、三种压缩格式的打包方式

1. 打包并用 gzip 压缩(.tar.gz)

tar -czvf archive.tar.gz example.txt

# 目录也一样,加 z
tar -czvf backup.tar.gz /path/to/directory

gzip 用得最广,速度和压缩率的平衡点比较好,日常默认用它就行。

2. 打包并用 bzip2 压缩(.tar.bz2)

tar -cjvf backup.tar.bz2 /path/to/directory

bzip2 压缩率通常比 gzip 高,但速度更慢,适合对体积敏感、对时间不敏感的场景。

3. 打包并用 xz 压缩(.tar.xz)

tar -cJvf backup.tar.xz /path/to/directory

xz 的压缩率在这三者里最高,代价是慢,大目录可能要跑很久,建议配合 -J 大写选项并留足磁盘。

五、往已有归档里追加文件

tar -rvf archive.tar newfile.txt

-r 是 append。这里有个限制:对未压缩的 .tar 才能直接追加,压缩过的 .tar.gz 没法往里加东西,得重新打包一次。

六、解压的几种写法

1. 解压不压缩的 .tar

tar -xvf archive.tar

解压到当前目录。-x 是 extract(取出)。

2. 解压到指定目录

tar -xvf archive.tar -C /path/to/directory

-C 指定目标目录,目录得先存在。

3. 解压 .tar.gz / .bz2 / .xz

tar -xzvf archive.tar.gz
tar -xjvf archive.tar.bz2
tar -xJvf archive.tar.xz

对应 z、j、J 三个字母,分别对应 gzip、bzip2、xz。记法很简单:压缩用什么,解压就用什么字母。

七、只解压其中一部分文件

tar -xvf archive.tar file1.txt file2.txt

后面直接跟文件名,只会提取归档里指定的那些。想先看看里面有什么再决定,用 -t 列出内容:

tar -tvf archive.tar

输出会带权限、属主、大小和时间戳,用来核对归档是否完整很方便。

八、打包时排除特定文件或目录

tar -czvf backup.tar.gz /path/to/directory --exclude=/path/to/directory/excludefile.txt

备份代码目录时常用,比如把 node_modules、日志日志、缓存排除掉:

tar -czvf backup.tar.gz /srv/app --exclude=node_modules --exclude=logs

九、用管道直接压缩与解压

不落中间文件,直接走管道传输或存储:

# 打包后用 gzip 压缩
tar -cvf - /path/to/directory | gzip > backup.tar.gz

# 解压 .tar.gz 再解包
gzip -dc backup.tar.gz | tar -xvf -

这种写法在远程备份脚本里很实用,例如 ssh 目标 tar -cf - /path | tar -xf - 就能跨机器直接传目录,省一次落盘。

十、校验归档完整性

tar -cvWf archive.tar file1.txt file2.txt

-W 是写时校验,会在归档过程中逐个校验文件。对大目录来说这一步很耗时,一般在重要备份的脚本里加,日常随手打的包不必每次都跑。

十一、几个容易出错的地方

  • -f 后面必须紧跟归档文件名,写成 tar -cvf /tmp/a.tar 中间不要换参数顺序,-f 会把它后面紧跟的那个参数当成文件名。
  • 解压到 / 这类目录时,建议加 -P(保留绝对路径)或不加 -P 让 tar 自动去掉开头的 /,避免覆盖系统文件。
  • 文件名里有空格或中文时,用引号包起来,或用 --null 配合 --files-from 从文件列表读取。
  • 打包时把相对路径和绝对路径混用,解压出来的目录层级会乱,建议统一在一个干净目录下操作。

十二、总结

把 tar 记成一个公式就够了:tar + 动作(c 建 / x 取 / t 列 / r 追加)+ 压缩字母(z 是 gzip、j 是 bzip2、J 是 xz)+ f + 文件名。剩下的是场景:备份用 -czvf 或 -cJvf,跨机器传输用管道,备份大目录记得加 --exclude,重要归档用 -W 校验一遍。掌握这几条,日常九成的打包解压需求都能覆盖。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表