Linux 打包(归档)和压缩详解:从入门到精通

在 Linux 系统管理和日常使用中,我们经常需要将多个文件或整个目录组合成一个单一的文件,以便于传输、备份或节省存储空间。这时,我们就会用到“打包”和“压缩”这两个核心概念。尽管这两个词经常被混用,但它们在 Linux 世界中有着明确的区别:

  • 打包(归档):将多个文件和目录集合成一个文件,这个过程称为打包,生成的文件通常称为归档文件。打包本身不一定会减小文件大小,它只是将数据“捆”在一起。最典型的工具是 tar
  • 压缩:通过特定的算法处理一个或多个文件,消除冗余数据,从而减小其占用的磁盘空间。压缩通常作用于单个文件。如果要压缩多个文件,通常需要先将它们打包成一个归档文件,然后再压缩这个归档文件。

理解这两者的区别是掌握 Linux 文件管理的关键。本文将深入探讨最常用的打包工具 tar 和各种压缩工具(如 gzip, bzip2, xz),并通过实例和最佳实践帮助你高效地使用它们。


目录#

  1. 核心工具:tar
  2. 压缩工具
  3. 强强联合:一步完成打包与压缩
  4. 常见实践与最佳实践
  5. 总结
  6. 参考资料

核心工具:tar#

tar 是 Linux 下最强大、最通用的打包(归档)工具,其名字源于 "Tape ARchive"(磁带归档)。

tar 基础语法#

tar [选项...] [归档文件名] [要打包的文件或目录...]

常用参数详解#

tar 的参数风格有两种:传统短选项(如 -xvf)和现代长选项(如 --extract --verbose --file)。在实际使用中,短选项更为常见。

  • 主操作模式(必须指定一个):
    • -c--create: 创建一个新的归档文件。
    • -x--extract: 解包,从归档文件中提取文件。
    • -t--list: 查看,列出归档文件中包含的文件列表。
  • 辅助选项:
    • -f--file=ARCHIVE: 指定归档文件名。这是至关重要的选项,后面必须紧跟文件名。
    • -v--verbose: 详细模式,显示正在处理的文件列表。在解包时让你看到进度。
    • -z--gzip: 通过 gzip 过滤器处理归档文件(压缩或解压)。
    • -j--bzip2: 通过 bzip2 过滤器处理归档文件。
    • -J--xz: 通过 xz 过滤器处理归档文件。
    • -C--directory=DIR: 解包时切换到指定目录再执行。
    • -P--absolute-names: 保留文件路径的根目录(即绝对路径),使用需极其小心
    • --exclude=PATTERN: 排除符合模式的文件。

创建归档#

dir1file2.txt 打包成一个名为 my_archive.tar 的文件。

tar -cvf my_archive.tar dir1 file2.txt
  • -c: 创建。
  • -v: 显示打包的文件。
  • -f my_archive.tar: 指定生成的归档文件名为 my_archive.tar

查看归档内容#

列出 my_archive.tar 中包含哪些文件,而不解包。

tar -tf my_archive.tar

提取归档#

my_archive.tar 中的内容提取到当前目录。

tar -xvf my_archive.tar
  • -x: 提取。

向现有归档追加文件#

tar 不支持直接像 zip 那样轻松追加。一种方法是先解包,添加新文件,再重新打包。另一种是使用 -r(不推荐,有局限性)。更推荐的方法是使用 -A 合并两个 tar 包。

# 方法一:解包-添加-重包(最稳妥)
tar -xvf my_archive.tar
cp new_file.txt ./
tar -cvf my_archive.tar ./*
 
# 方法二:合并归档(推荐用于合并tar包)
tar -Af original.tar additional.tar

压缩工具#

如前所述,压缩工具通常用于处理单个文件。因此,我们会先使用 tar 打包,然后再用压缩工具压缩生成的 .tar 文件。但更常见的做法是使用 tar 的快捷选项一步到位。

gzip#

  • 扩展名: .gz
  • 特点: 速度快,压缩率相对较低,是 Linux 世界最普遍的支持。
  • 工具: gzip, gunzip, zcat.

单独使用:

# 压缩 file.tar
gzip file.tar
# 完成后会生成 file.tar.gz,并删除原 file.tar
 
# 解压 file.tar.gz
gunzip file.tar.gz
# 或 gzip -d file.tar.gz

bzip2#

  • 扩展名: .bz2
  • 特点: 速度比 gzip 慢,但压缩率更高。
  • 工具: bzip2, bunzip2, bzcat.

单独使用:

# 压缩
bzip2 file.tar
 
# 解压
bunzip2 file.tar.bz2

xz#

  • 扩展名: .xz
  • 特点: 拥有当前三者中最高的压缩率,但速度也最慢,非常耗 CPU 和时间。适合用于不常访问但需要极致压缩的归档(如发行版镜像)。
  • 工具: xz, unxz, xzcat.

单独使用:

# 压缩(可使用 -0 到 -9 指定压缩级别,-6 是默认)
xz -9 file.tar
 
# 解压
unxz file.tar.xz

压缩算法对比#

工具扩展名压缩速度解压速度压缩率典型用途
gzip.gz中等通用、日志压缩、网络传输
bzip2.bz2中等软件源代码分发
xz.xz非常慢中等最高发行版镜像、长期存档

强强联合:一步完成打包与压缩#

tar 命令的巧妙之处在于它可以通过一个选项直接调用压缩过滤器,从而将打包和压缩两个步骤合二为一。这是最常用、最推荐的方法。

创建压缩归档#

  • 创建 .tar.gz 归档:

    tar -czvf project_backup.tar.gz /path/to/project/
  • 创建 .tar.bz2 归档:

    tar -cjvf project_backup.tar.bz2 /path/to/project/
  • 创建 .tar.xz 归档:

    tar -cJvf project_backup.tar.xz /path/to/project/

解压压缩归档#

同样,使用对应的选项即可解压。

  • 解压 .tar.gz 归档:

    tar -xzvf project_backup.tar.gz
  • 解压 .tar.bz2 归档:

    tar -xjvf project_backup.tar.bz2
  • 解压 .tar.xz 归档:

    tar -xJvf project_backup.tar.xz

万能解压技巧:如果你不记得压缩格式,可以尝试使用 -xvf 参数,让 tar 自动检测格式。

tar -xvf project_backup.tar.xx # .gz, .bz2, .xz 都适用

常见实践与最佳实践#

排除特定文件#

在备份时,我们经常需要排除临时文件、日志文件或版本控制目录(如 .git, node_modules)。

tar -czvf backup.tar.gz /path/to/project/ --exclude="*.log" --exclude=".git" --exclude="node_modules"

也可以将排除模式写在一个文件里,例如 exclude_list.txt

*.tmp
.cache
*.log

然后使用 -X 选项:

tar -czvf backup.tar.gz /path/to/project/ -X exclude_list.txt

保留文件权限和属性#

使用 -p(或 --preserve-permissions)选项来保留文件的原始权限(如可执行权限)。对于备份系统文件,这通常很重要。

tar -czvpf etc_backup.tar.gz /etc/

用于备份的经典命令#

一个完整的系统目录备份命令可能如下所示:

# 备份 /home 目录,排除缓存和临时文件,保留权限,并记录日志
sudo tar -czvpf home_backup-$(date +%Y%m%d).tar.gz /home/ \
  --exclude="/home/*/.cache" \
  > home_backup-$(date +%Y%m%d).log 2>&1
  • $(date +%Y%m%d) 会自动生成日期(如 20231027),方便归档文件的管理。
  • > ...log 2>&1 将标准输出和错误输出都重定向到日志文件。

解压到指定目录#

使用 -C 选项可以指定解压的目标目录,而不是当前目录。

# 将归档解压到 /tmp/extract_here 目录
mkdir -p /tmp/extract_here
tar -xzvf project_backup.tar.gz -C /tmp/extract_here

总结#

任务常用命令
打包tar -cvf archive.tar file1 dir2
查看tar -tf archive.tar
解包tar -xvf archive.tar
打包并压缩 (gzip)tar -czvf archive.tar.gz /path/
解压并解包 (gzip)tar -xzvf archive.tar.gz
打包并压缩 (xz)tar -cJvf archive.tar.xz /path/
解压到指定目录tar -xzvf archive.tar.gz -C /target/dir
备份并排除文件tar -czvf backup.tar.gz /path/ --exclude="pattern"

掌握 tar 与各种压缩工具的组合使用,是 Linux 用户的一项基本且重要的技能。记住 -c(创建)、-x(提取)、-t(查看)这三个核心命令,再配合 -f(指定文件)和 -v(查看详情),你就能应对绝大多数情况。根据你对速度与压缩率的需求,灵活选择 -z, -j, -J,将使你的文件管理效率大大提升。


参考资料#

  1. GNU Tar Manual: https://www.gnu.org/software/tar/manual/
  2. man 页面(最权威的本地文档):
    • man tar
    • man gzip
    • man bzip2
    • man xz
  3. TLDR Pages (简洁的示例参考): https://tldr.sh/ (例如 tldr tar, tldr gzip