介绍
在本实验中,我们将学习如何使用 tar、gzip 和 zip 等常用 Linux 命令来打包和压缩文件及目录。这些工具对于在 Linux 系统上管理文件和目录至关重要,能够让你高效地存储和传输数据。我们将从基础操作开始,逐步过渡到更复杂的任务,并详细解释每一个步骤。
在本实验中,我们将学习如何使用 tar、gzip 和 zip 等常用 Linux 命令来打包和压缩文件及目录。这些工具对于在 Linux 系统上管理文件和目录至关重要,能够让你高效地存储和传输数据。我们将从基础操作开始,逐步过渡到更复杂的任务,并详细解释每一个步骤。
首先,让我们创建一个示例目录结构。这将帮助我们理解文件打包和压缩在处理不同类型的文件和目录时是如何工作的。
打开终端并输入以下命令:
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
让我们分解一下这些命令的作用:
cd ~/project:将当前目录切换到你主目录下的 project 文件夹。mkdir -p test_dir/{subdir1,subdir2}:创建一个名为 test_dir 的新目录,并在其内部创建两个子目录:subdir1 和 subdir2。-p 选项允许 mkdir 根据需要创建父目录。echo 命令在新建目录结构的不同位置创建了包含示例内容的文本文件。现在,让我们验证一下创建的结构:
tree test_dir
如果你没有看到预期的输出,或者收到「command not found」的错误提示,请不要担心。你的系统中可能没有安装 tree 命令。你可以改用 ls -R test_dir,它会显示类似(虽然图形化程度较低)的输出。
有了示例目录结构后,我们来学习如何使用 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 归档之前,先学习如何从中提取文件。这是处理归档文件时的一项重要技能。
要提取 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
这将显示归档中原有的目录结构和文件。
现在我们已经创建了一个 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,它们是等价的。
既然我们已经完成了打包和压缩操作,现在来理解这两者之间的区别并对比文件大小。
打包(归档):
tar(磁带归档)压缩:
gzip、bzip2、xz让我们对比原始目录、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
你会注意到:
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
这将显示归档中原有的目录结构和文件。
虽然 tar 和 gzip 在 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 中常用的几种重要文件打包与压缩技术:
tar 在不压缩的情况下打包文件,这对于将多个文件和目录捆绑在一起非常有用。gzip 压缩文件,这可以显著减小文件体积,便于存储或传输。tar 和 gzip 一步创建压缩归档,这是 Linux 系统中的常见操作。zip 创建了具有更好跨平台兼容性的归档,这在与 Windows 用户分享文件时特别有用。这些技能对于在 Linux 中进行高效的文件管理至关重要,尤其是在处理大量数据或在系统间传输文件时。请记住,压缩可以显著减小文件大小,从而提高存储和传输效率。
随着你继续深入学习 Linux,你会发现这些命令在管理文件和目录时非常有用。请多加练习这些操作,以熟练掌握文件打包与压缩技术。