文件打包与压缩

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/CompressionandArchivingGroup(["Compression and Archiving"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") linux/SystemInformationandMonitoringGroup -.-> linux/du("File Space Estimating") linux/CompressionandArchivingGroup -.-> linux/tar("Archiving") linux/CompressionandArchivingGroup -.-> linux/zip("Compressing") linux/CompressionandArchivingGroup -.-> linux/gzip("Gzip") linux/CompressionandArchivingGroup -.-> linux/unzip("Decompressing") subgraph Lab Skills linux/ls -.-> lab-385413{{"文件打包与压缩"}} linux/touch -.-> lab-385413{{"文件打包与压缩"}} linux/cd -.-> lab-385413{{"文件打包与压缩"}} linux/mkdir -.-> lab-385413{{"文件打包与压缩"}} linux/du -.-> lab-385413{{"文件打包与压缩"}} linux/tar -.-> lab-385413{{"文件打包与压缩"}} linux/zip -.-> lab-385413{{"文件打包与压缩"}} linux/gzip -.-> lab-385413{{"文件打包与压缩"}} linux/unzip -.-> lab-385413{{"文件打包与压缩"}} end

创建示例目录结构

让我们从创建一个示例目录结构开始,这将帮助我们理解文件打包和压缩如何与不同类型的文件和目录一起工作。

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

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

此命令列出 (-t) 归档文件的内容,详细 (-v) 显示,从名为 test_archive.tar 的文件 (-f) 中读取。

从 tar 归档文件中提取文件

在压缩我们的 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(Tape Archive)
    • 结果:归档文件的总大小通常略大于其中所有文件的总和。
  2. 压缩:

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

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

## 原始目录的大小
echo "原始目录的大小:"
du -sh test_dir

## tar 归档文件的大小(我们将重新创建它以进行比较)
tar -cvf test_archive_compare.tar test_dir
echo "tar 归档文件的大小:"
ls -lh test_archive_compare.tar

## 压缩后的 tar.gz 文件的大小
echo "压缩后的 tar.gz 文件的大小:"
ls -lh test_archive.tar.gz

你会注意到:

  1. tar 归档文件比原始目录略大。这是因为 tar 向归档文件中添加了一些元数据,例如文件名、权限和目录结构。
  2. 压缩后的 tar.gz 文件比原始目录和 tar 归档文件都小得多。

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

另一方面,压缩通过识别并消除数据中的冗余,显著减小了文件大小。这对于文本文件或具有重复内容的文件特别有效。

一步创建压缩归档文件

虽然理解创建 tar 归档文件并随后压缩它的单独步骤很有帮助,但在实践中,这些步骤通常是合并的。tar 命令提供了一个内置选项,可以在创建归档文件时使用 gzip 进行压缩。

让我们一步创建 test_dir 的压缩 tar 归档文件:

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 系统中很常见,但 zip 格式通常用于更好地兼容 Windows 系统。让我们为 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,你会发现这些命令在管理文件和目录时非常有用。通过练习这些操作,你将熟练掌握文件打包和压缩技术。