跟我们一起
玩转路由器

如何在Linux中压缩文件?使用tar命令创建压缩归档文件

使用tar命令可打包并压缩文件,结合gzip(-z)、bzip2(-j)、xz(-J)实现高效归档,支持打包时排除文件、解压时提取指定文件,并可通过pv监控进度、ssh管道远程传输,注意权限保留与磁盘空间管理。

在Linux中,要压缩文件,我们最常用的工具就是

命令。它不仅仅是用来“压缩”的,更确切地说,首先是将多个文件或目录“打包”成一个归档文件,然后通常会结合其他工具(比如、或)来实现真正的压缩。所以,如果你想把一个目录或者一堆文件变成一个更小、更方便传输的单一文件,就是你的首选。

解决方案

使用

命令创建压缩归档文件,核心在于理解它的几个关键选项以及如何与不同的压缩算法结合。

最常见也是最推荐的做法,是先用

把文件或目录打包成一个文件,然后通过指定压缩选项,让在打包的同时进行压缩。

创建压缩归档文件:

  1. 使用

    压缩( 或 ): 这是最常用、兼容性最好的方式。

    • : 创建一个新的归档文件。
    • : 使用进行压缩。
    • : 显示详细信息(verbose),让你看到哪些文件被打包了。
    • : 指定归档文件的名称。

    示例:

  2. 使用

    压缩( 或 ): 相比,通常能提供更高的压缩率,但压缩和解压速度会稍慢。

    • : 使用进行压缩。

    示例:

  3. 使用

    压缩( 或 ): 提供了最高的压缩率,但也是最慢的,适用于对压缩率要求极高,且不急于完成的场景。

    • : 使用进行压缩。

    示例:

解压归档文件:

解压时,只需将创建时的

替换为(extract),并确保使用正确的解压选项(, , )。

  1. 解压

    • : 从归档文件中提取文件。
  2. 解压

  3. 解压

默认情况下,文件会解压到当前目录。如果你想解压到特定目录,可以使用

选项:

为什么在Linux中我们通常先“打包”再“压缩”?和、有什么区别?

这个问题其实挺有意思的,它触及到了Linux文件处理哲学的一些核心。简单来说,

(Tape ARchiver的缩写,历史产物了)的主要职责是“打包”,也就是把多个文件和目录整合成一个单一的归档文件。它本身并不进行压缩,只是把所有数据顺序地写入一个大文件里,同时保留了文件权限、所有者、时间戳等元数据。这就像你把一堆散乱的文档放进一个文件夹,然后把文件夹整个装进一个大箱子。这个箱子(归档)本身并没有变小,只是变得规整了。

、、这些才是真正的“压缩”工具。它们的工作是读取一个输入流(通常是一个文件),然后通过各种算法(如LZ77、Burrows-Wheeler变换等)来减少数据冗余,从而生成一个更小的输出流。它们天生就是为处理单个文件而设计的。

所以,当我们要处理一个目录,或者一堆文件时,如果直接用

去压缩,它会把每个文件单独压缩成文件,而不是一个整体。这样一来,你还是有一堆散乱的文件,管理起来并不方便。

区别总结:

  • :
    • 功能: 打包(归档),将多个文件/目录整合成一个单一文件。
    • 特点: 保留文件结构、权限、所有者、时间戳等元数据。本身不压缩。
    • 适用场景: 备份整个目录结构,传输多个文件作为一个整体。
  • / / :
    • 功能: 压缩,减小文件大小。
    • 特点: 只能处理单个文件(或者通过管道处理数据流)。
    • 适用场景: 减小单个文件大小,或者作为的后端压缩工具。

和这些压缩工具结合起来,比如,就是利用了的打包能力和的压缩能力。把文件流输出,然后这个流直接被接收并压缩,最后写入到文件中。这种“职责分离”的设计,使得工具链更加灵活和强大,也符合Unix/Linux“小工具做一件事,并把它做好”的哲学。

如何只压缩或解压归档中的特定文件或目录?

在实际操作中,我们经常会遇到这样的需求:一个巨大的

归档文件里,我只关心其中的某几个文件,或者只想把某个子目录解压出来。幸好,命令对此提供了非常灵活的支持。

创建时只包含特定文件或目录:

在创建归档时,你只需在命令的末尾列出你想要包含的文件或目录即可。

如果你想排除某些文件或目录,可以使用

选项。这在备份整个目录但不想包含临时文件或日志文件时特别有用。

解压时只提取特定文件或目录:

解压时,你可以在归档文件名的后面指定你想要提取的文件或目录的路径。这些路径必须与归档内部的路径结构相匹配。

如果你不确定归档内部的文件结构,可以先使用

(list)选项查看归档内容:

这会列出归档中所有文件的路径,帮助你准确地指定要提取的目标。

处理大型文件或远程服务器上的归档时,有哪些实用技巧和注意事项?

处理大型

归档文件,尤其是在远程服务器上,常常会遇到一些挑战,比如进度监控、网络带宽限制、磁盘空间不足等。这里有一些我个人觉得非常实用的技巧和注意事项。

1. 监控大型归档的进度:

命令

当你压缩或解压一个非常大的目录时,

命令默认是静默的,你不知道它进行到哪一步了。这时候(Pipe Viewer)就派上用场了。可以让你在管道中看到数据的传输进度。

创建时:

这里

选项是告诉总大小,这样它就能计算百分比。用于获取目录的字节大小。 中的表示将归档内容输出到标准输出(stdout),然后通过管道传递给。处理后,再重定向到最终的文件。

解压时:

这里

读取文件内容并输出到标准输出,则从标准输入读取数据进行解压。

2. 远程服务器上的直接传输和压缩

这是我最常用的技巧之一,尤其是在服务器之间迁移数据或备份时。你可以通过

和管道,实现数据在两台机器之间直接传输并压缩,无需在中间存储未压缩的临时文件。

从远程服务器压缩并拉取到本地:

这行命令的意思是:通过

连接到远程服务器,在远程服务器上执行(表示输出到stdout),然后将远程服务器的stdout通过通道传输到本地,并重定向到文件。

从本地推送并解压到远程服务器:

这行命令的意思是:在本地压缩

并输出到stdout,然后通过管道将其发送给。连接到远程服务器后,将接收到的数据通过管道传递给,在远程服务器上直接解压到指定目录。

3. 权限和所有权(Permissions and Ownership)

在默认情况下会保留文件的权限、所有者和组信息。这在备份和恢复系统文件或用户数据时非常重要。

  • 创建时: 通常无需特殊处理,会自动记录这些信息。
  • 解压时: 如果你以普通用户身份解压,文件会以你的用户身份创建,并且可能无法恢复原始的所有者和组信息(除非你是root用户)。如果你需要恢复原始的所有者和组信息,必须以用户(或使用)来执行解压操作。

    否则,即使归档中记录了原始所有者,解压后文件所有者也会变成当前执行解压的用户。

4. 磁盘空间管理

处理大型文件时,一定要提前检查目标磁盘是否有足够的空间。

  • 压缩前: 使用检查源目录大小。
  • 压缩后: 压缩率因数据类型而异,但通常可以预留源文件大小的20%-50%作为压缩后的空间估算。
  • 解压前: 归档文件的大小不等于解压后的实际大小。解压一个10GB的文件可能需要100GB的磁盘空间。所以,务必检查目标路径的可用空间:。

5. 增量备份(Incremental Backups)

对于需要定期备份但数据量巨大的场景,每次都全量备份效率很低。

支持增量备份,只备份自上次备份以来发生变化的文件。这需要一些额外的步骤和管理,但能显著节省时间和空间。

基本流程是:

  • 第一次全量备份,并记录状态文件:
  • 后续增量备份,基于状态文件:

    是一个用来记录文件状态的元数据文件,每次增量备份都会更新它。恢复时需要从全量备份开始,然后按顺序应用所有增量备份。这块内容比较深入,但在处理超大型数据集时,它能帮你省去很多麻烦。

这些技巧和注意事项,都是我在实际工作中摸索出来的,希望能帮助你在处理Linux文件压缩和归档时更加得心应手。

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《如何在Linux中压缩文件?使用tar命令创建压缩归档文件》
文章链接:https://www.lu-you.com/settings/26819.html
本站资源来源于互联网整理,若有图片影像侵权,联系邮箱429682998@qq.com删除,谢谢。

评论 抢沙发

登录

找回密码

注册