首页 > 系统教程 > LINUX > 正文

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

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

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

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

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

解决方案

使用

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

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

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

创建压缩归档文件:

  1. 使用

    gzip
    登录后复制
    压缩(
    .tar.gz
    登录后复制
    .tgz
    登录后复制
    ):
    这是最常用、兼容性最好的方式。

    tar -czvf archive_name.tar.gz /path/to/your/files_or_directory
    登录后复制
    • -c
      登录后复制
      : 创建一个新的归档文件。
    • -z
      登录后复制
      : 使用
      gzip
      登录后复制
      进行压缩。
    • -v
      登录后复制
      : 显示详细信息(verbose),让你看到哪些文件被打包了。
    • -f
      登录后复制
      : 指定归档文件的名称。

    示例:

    # 压缩当前目录下的my_project文件夹
    tar -czvf my_project_backup.tar.gz my_project/
    
    # 压缩多个文件
    tar -czvf important_docs.tar.gz doc1.txt report.pdf
    登录后复制
  2. 使用

    bzip2
    登录后复制
    压缩(
    .tar.bz2
    登录后复制
    .tbz2
    登录后复制
    ):
    相比
    gzip
    登录后复制
    bzip2
    登录后复制
    通常能提供更高的压缩率,但压缩和解压速度会稍慢。

    tar -cjvf archive_name.tar.bz2 /path/to/your/files_or_directory
    登录后复制
    • -j
      登录后复制
      : 使用
      bzip2
      登录后复制
      进行压缩。

    示例:

    tar -cjvf large_data.tar.bz2 /var/log/
    登录后复制
  3. 使用

    xz
    登录后复制
    压缩(
    .tar.xz
    登录后复制
    .txz
    登录后复制
    ):
    xz
    登录后复制
    提供了最高的压缩率,但也是最慢的,适用于对压缩率要求极高,且不急于完成的场景。

    tar -cJvf archive_name.tar.xz /path/to/your/files_or_directory
    登录后复制
    • -j
      登录后复制
      : 使用
      xz
      登录后复制
      进行压缩。

    示例:

    tar -cJvf ultimate_archive.tar.xz /home/user/my_huge_archive/
    登录后复制

解压归档文件:

解压时,只需将创建时的

-c
登录后复制
替换为
-x
登录后复制
(extract),并确保使用正确的解压选项(
-z
登录后复制
,
-j
登录后复制
,
-j
登录后复制
)。

  1. 解压

    .tar.gz
    登录后复制

    tar -xzvf archive_name.tar.gz
    登录后复制
    • -x
      登录后复制
      : 从归档文件中提取文件。
  2. 解压

    .tar.bz2
    登录后复制

    tar -xjvf archive_name.tar.bz2
    登录后复制
  3. 解压

    .tar.xz
    登录后复制

    tar -xJvf archive_name.tar.xz
    登录后复制

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

-c
登录后复制
选项:

tar -xzvf archive_name.tar.gz -C /path/to/destination_directory
登录后复制

为什么在Linux中我们通常先“打包”再“压缩”?
tar
登录后复制
gzip
登录后复制
bzip2
登录后复制
有什么区别

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

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

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

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

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

区别总结:

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

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

如何只压缩或解压
tar
登录后复制
归档中的特定文件或目录?

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

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

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

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

# 示例1:只压缩当前目录下的file1.txt和my_sub_dir文件夹
tar -czvf partial_archive.tar.gz file1.txt my_sub_dir/

# 示例2:压缩某个目录下的特定文件,例如只压缩/var/log/nginx/下的access.log和error.log
tar -czvf nginx_logs.tar.gz /var/log/nginx/access.log /var/log/nginx/error.log
登录后复制

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

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

# 示例:压缩my_project目录,但排除其中的.git文件夹和build目录
tar -czvf my_project_no_git_build.tar.gz --exclude='./my_project/.git' --exclude='./my_project/build' my_project/
# 注意:--exclude 后面跟着的路径是相对于 tar 命令要处理的目录而言的。
# 如果你是在my_project的父目录执行,并且要压缩my_project,那么路径就是 './my_project/.git'
登录后复制

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

Logome
Logome

AI驱动的Logo生成工具

Logome 133
查看详情 Logome

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

# 示例1:从archive.tar.gz中只解压file1.txt
tar -xzvf archive.tar.gz file1.txt

# 示例2:从archive.tar.gz中只解压my_project/src/目录
tar -xzvf archive.tar.gz my_project/src/

# 示例3:如果知道归档里有一个名为'data/report.csv'的文件,只解压它
tar -xzvf backup.tar.gz data/report.csv
登录后复制

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

-t
登录后复制
(list)选项查看归档内容:

tar -tzvf archive.tar.gz
登录后复制

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

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

处理大型

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

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

pv
登录后复制
命令

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

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

创建时:

# 压缩my_huge_data目录,并通过pv监控进度
tar -czf - my_huge_data/ | pv -s $(du -sb my_huge_data/ | awk '{print $1}') > my_huge_data.tar.gz
登录后复制

这里

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

解压时:

# 解压my_huge_data.tar.gz,并监控进度
pv my_huge_data.tar.gz | tar -xzf -
登录后复制

这里

pv
登录后复制
读取文件内容并输出到标准输出,
tar -xzf -
登录后复制
则从标准输入读取数据进行解压。

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

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

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

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

ssh user@remote_server "tar -czf - /path/to/remote/directory" > local_backup.tar.gz
登录后复制

这行命令的意思是:通过

ssh
登录后复制
连接到远程服务器,在远程服务器上执行
tar -czf - /path/to/remote/directory
登录后复制
-
登录后复制
表示输出到stdout),然后将远程服务器的stdout通过
ssh
登录后复制
通道传输到本地,并重定向到
local_backup.tar.gz
登录后复制
文件。

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

tar -czf - /path/to/local/directory | ssh user@remote_server "tar -xzf - -C /path/to/remote/destination"
登录后复制

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

/path/to/local/directory
登录后复制
并输出到stdout,然后通过管道
|
登录后复制
将其发送给
ssh
登录后复制
ssh
登录后复制
连接到远程服务器后,将接收到的数据通过管道传递给
tar -xzf - -C /path/to/remote/destination
登录后复制
,在远程服务器上直接解压到指定目录。

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

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

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

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

4. 磁盘空间管理

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

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

5. 增量备份(Incremental Backups)

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

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

基本流程是:

  • 第一次全量备份,并记录状态文件:
    tar -czg snapshot.file -f full_backup.tar.gz /path/to/data
    登录后复制
  • 后续增量备份,基于状态文件:
    tar -czg snapshot.file -f incremental_backup_$(date +%Y%m%d).tar.gz /path/to/data
    登录后复制

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

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

以上就是如何在Linux中压缩文件?使用tar命令创建压缩归档文件的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号