文件打包与压缩

LinuxBeginner
立即练习

介绍

在本实验中,我们将学习如何使用 targzipzip 等常用 Linux 命令来打包和压缩文件及目录。这些工具对于在 Linux 系统上管理文件和目录至关重要,能够让你高效地存储和传输数据。我们将从基础操作开始,逐步过渡到更复杂的任务,并详细解释每一个步骤。

这是一个引导式实验,提供了逐步的指导来帮助你学习和实践。请仔细遵循说明完成每个步骤,以获得实战经验。历史数据显示,这是一个初学者级别的实验,完成率为 96%。它获得了学习者 99% 的好评率。

创建示例目录结构

首先,让我们创建一个示例目录结构。这将帮助我们理解文件打包和压缩在处理不同类型的文件和目录时是如何工作的。

打开终端并输入以下命令:

cd ~/project
mkdir -p test_dir/{subdir1,subdir2}
echo "This is file 1" > test_dir/file1.txt
echo "This is file 2" > test_dir/file2.txt
echo "This is in subdir1" > test_dir/subdir1/subfile1.txt
echo "This is in subdir2" > test_dir/subdir2/subfile2.txt

让我们分解一下这些命令的作用:

  1. cd ~/project:将当前目录切换到你主目录下的 project 文件夹。
  2. mkdir -p test_dir/{subdir1,subdir2}:创建一个名为 test_dir 的新目录,并在其内部创建两个子目录:subdir1subdir2-p 选项允许 mkdir 根据需要创建父目录。
  3. echo 命令在新建目录结构的不同位置创建了包含示例内容的文本文件。

现在,让我们验证一下创建的结构:

tree test_dir

如果你没有看到预期的输出,或者收到「command not found」的错误提示,请不要担心。你的系统中可能没有安装 tree 命令。你可以改用 ls -R test_dir,它会显示类似(虽然图形化程度较低)的输出。

使用 tar 打包文件

有了示例目录结构后,我们来学习如何使用 tar 命令打包文件。tar 代表「磁带归档」(tape archive),最初用于在磁带驱动器上创建归档。如今,它通常用于将多个文件和目录捆绑成一个单一文件。

让我们打包 test_dir

cd ~/project
tar -cvf test_archive.tar test_dir

让我们分解这个命令:

  • tar:我们用于创建归档的命令。
  • -c:该选项告诉 tar 创建一个新的归档。
  • -v:代表「详细模式」(verbose)。它会让 tar 打印出正在添加到归档中的文件名。这是可选的,但有助于观察操作进度。
  • -f:该选项后面紧跟我们要创建的归档文件名。
  • test_archive.tar:这是我们为新归档文件起的名字。.tar 后缀是 tar 归档的常规扩展名。
  • test_dir:这是我们要打包进归档的目录。

运行此命令后,你应该会看到被添加到归档中的文件列表。

要在不解压的情况下查看归档内容,可以使用:

tar -tvf test_archive.tar

该命令会以详细模式(-v)列出(-t)名为 test_archive.tar 的文件(-f)中的内容。

从 tar 归档中提取文件

在压缩 tar 归档之前,先学习如何从中提取文件。这是处理归档文件时的一项重要技能。

要提取 test_archive.tar 文件的内容:

mkdir extracted_tar
tar -xvf test_archive.tar -C extracted_tar

让我们分解这个命令:

  • mkdir extracted_tar:创建一个名为 extracted_tar 的新目录,用于存放提取出的内容。
  • tar:用于提取归档的命令。
  • -x:该选项告诉 tar 从归档中提取文件。
  • -v:详细模式,显示每个正在提取的文件。
  • -f:指定要操作的归档文件名。提取文件时,后面应跟要提取的 tar 文件路径或名称。
  • -C extracted_tar:该选项告诉 tar 在提取文件之前先切换到 extracted_tar 目录。

运行此命令后,你应该会看到提取出的文件列表。

要验证提取结果,可以使用:

tree extracted_tar

如果 tree 不可用:

ls -R extracted_tar

这将显示归档中原有的目录结构和文件。

使用 gzip 压缩文件

现在我们已经创建了一个 tar 归档,让我们使用 gzip 对其进行压缩:

gzip test_archive.tar

该命令会压缩 test_archive.tar 并将其重命名为 test_archive.tar.gz。原始的 test_archive.tar 文件将被压缩版替换。

要查看压缩文件的大小,可以使用以下命令:

ls -lh test_archive.tar.gz

-lh 选项将以易读的格式(如 KB、MB 等)显示文件大小。

值得注意的是,虽然 .tar.gz 扩展名很常见,但你可能也会看到 .tgz,它们是等价的。

理解打包与压缩的区别

既然我们已经完成了打包和压缩操作,现在来理解这两者之间的区别并对比文件大小。

  1. 打包(归档):

    • 目的:将多个文件和目录合并为一个单一文件。
    • 作用:将文件组合在一起,并添加一些元数据。
    • 示例工具:tar(磁带归档)
    • 结果:归档文件的总大小通常略大于其中所有文件大小的总和。
  2. 压缩:

    • 目的:减小文件或归档的大小。
    • 作用:应用算法消除数据中的冗余,使文件变小。
    • 示例工具:gzipbzip2xz
    • 结果:压缩后的文件比原文件小,但在使用前需要解压缩。

让我们对比原始目录、tar 归档和压缩后的 tar.gz 文件的大小:

## 原始目录的大小(实际文件内容大小)
echo "Size of the original directory (file content):"
find test_dir -type f -exec ls -l {} \; | awk '{total += $5} END {print total " bytes"}'

## tar 归档的大小(我们重新创建一个用于对比)
tar -cvf test_archive_compare.tar test_dir
echo "Size of the tar archive:"
ls -lh test_archive_compare.tar

## 压缩后的 tar.gz 文件大小
echo "Size of the compressed tar.gz file:"
ls -lh test_archive.tar.gz

## 作为参考,磁盘占用空间(包含块/扇区填充)
echo "Disk usage of the original directory:"
du -sh test_dir

你会注意到:

  1. tar 归档略大于原始文件内容的总和。这是因为 tar 向归档中添加了元数据,例如文件名、权限、时间戳和目录结构。
  2. 压缩后的 tar.gz 文件明显小于原始文件和 tar 归档。
  3. 磁盘占用空间(du)显示的值可能与实际文件大小不同,因为它包含了文件系统块分配的开销。

打包后体积增加是正常且符合预期的。tar 格式会增加少量开销来存储文件元数据,这对于在解包时正确重建目录结构是必要的。对于较大的目录,这种开销通常可以忽略不计,但对于非常小的文件或目录,这种增加会比较明显。

相比之下,压缩通过识别并消除数据中的冗余来显著减小文件体积。这对于文本文件或具有重复内容的文件特别有效。

一步创建压缩归档

虽然了解先创建 tar 归档再进行压缩的独立步骤很有帮助,但在实际操作中,这些步骤通常是合并进行的。tar 命令内置了一个选项,可以在创建归档的同时使用 gzip 进行压缩。

让我们一步完成 test_dir 的压缩归档创建:

cd ~/project
tar -czvf test_combined.tar.gz test_dir

这个命令与我们之前使用的类似,但增加了一个重要的选项:

  • -z:该选项告诉 tar 使用 gzip 压缩归档。

生成的 test_combined.tar.gz 文件与我们分两步创建的文件是等效的,但我们一次性完成了所有操作。

要在不解压的情况下查看此压缩归档的内容:

tar -tzvf test_combined.tar.gz

这里的 -z 选项告诉 tar 我们正在处理一个经过 gzip 压缩的文件。

从压缩归档中提取文件

现在我们已经创建了压缩归档,了解如何从中提取文件非常重要。让我们提取 test_combined.tar.gz 文件的内容:

mkdir extracted
tar -xzvf test_combined.tar.gz -C extracted

让我们分解这个命令:

  • mkdir extracted:创建一个名为 extracted 的新目录,用于存放提取出的内容。
  • tar:用于提取归档的命令。
  • -x:该选项告诉 tar 从归档中提取文件。
  • -z:因为我们处理的是 gzip 压缩文件,所以需要此选项。
  • -v:详细模式,显示每个正在提取的文件。
  • -f:后面跟我们要从中提取的归档文件名。
  • -C extracted:该选项告诉 tar 在提取文件之前先切换到 extracted 目录。

运行此命令后,你应该会看到提取出的文件列表。

要验证提取结果,可以使用:

tree extracted

如果 tree 不可用:

ls -R extracted

这将显示归档中原有的目录结构和文件。

使用 zip 实现跨平台兼容性

虽然 targzip 在 Linux 和类 Unix 系统中很常见,但为了更好地与 Windows 系统兼容,通常会使用 zip 格式。让我们为 test_dir 创建一个 zip 归档:

cd ~/project
zip -r test_archive.zip test_dir

以下是该命令的作用:

  • zip:创建 zip 归档的命令。
  • -r:该选项告诉 zip 递归处理,包含所有文件和子目录。
  • test_archive.zip:我们为 zip 文件起的名字。
  • test_dir:我们要添加到 zip 归档中的目录。

要解压此归档,可以使用:

unzip -d unzipped_files test_archive.zip

-d 选项指定了解压到的目标目录。如果 unzipped_files 不存在,unzip 会自动创建它。

Zip 文件的优势在于它们在几乎所有操作系统上都能被轻松识别和使用,是跨平台分享文件的理想选择。

总结

在本实验中,我们学习了 Linux 中常用的几种重要文件打包与压缩技术:

  1. 我们创建了一个示例目录结构,演示了如何组织文件和目录。
  2. 我们使用 tar 在不压缩的情况下打包文件,这对于将多个文件和目录捆绑在一起非常有用。
  3. 我们学习了如何从 tar 归档中提取文件,这是处理打包文件时的必备技能。
  4. 我们使用 gzip 压缩文件,这可以显著减小文件体积,便于存储或传输。
  5. 我们理解了打包与压缩的区别,掌握了它们各自的用途和应用场景。
  6. 我们学习了如何结合使用 targzip 一步创建压缩归档,这是 Linux 系统中的常见操作。
  7. 我们练习了从压缩归档中提取文件,这是处理打包压缩文件的另一项关键技能。
  8. 最后,我们使用 zip 创建了具有更好跨平台兼容性的归档,这在与 Windows 用户分享文件时特别有用。

这些技能对于在 Linux 中进行高效的文件管理至关重要,尤其是在处理大量数据或在系统间传输文件时。请记住,压缩可以显著减小文件大小,从而提高存储和传输效率。

随着你继续深入学习 Linux,你会发现这些命令在管理文件和目录时非常有用。请多加练习这些操作,以熟练掌握文件打包与压缩技术。