0

0

如何在Linux下使用tar命令进行文件压缩?快速掌握备份与压缩技巧

絕刀狂花

絕刀狂花

发布时间:2025-09-06 09:58:03

|

778人浏览过

|

来源于php中文网

原创

答案:tar命令是Linux下文件归档与压缩的核心工具,通过结合gzip、bzip2、xz等算法实现高效压缩与解压。常用选项包括-c(创建)、-x(提取)、-z(gzip)、-j(bzip2)、-J(xz)、-v(显示过程)、-f(指定文件),支持查看归档内容(-t)。日常备份推荐gzip(-z)兼顾速度与压缩比,长期归档可选xz(-J)追求更高压缩率。高级功能如--exclude排除文件、-C指定解压目录、--listed-incremental实现增量备份,提升灵活性。处理大文件时,可用pv显示进度、split分卷压缩、md5sum校验完整性,避免操作风险。合理选择压缩算法与优化策略,能显著提升备份效率与数据安全性。

如何在linux下使用tar命令进行文件压缩?快速掌握备份与压缩技巧

在Linux环境下,

tar
命令是处理文件归档和压缩的基石。它本身的核心功能是“打包”,即将多个文件或目录整合成一个单一的
.tar
文件,便于传输或存储。而我们通常说的“压缩”,则是通过与
gzip
bzip2
xz
等压缩工具结合,生成
.tar.gz
.tar.bz2
.tar.xz
等格式。掌握
tar
,意味着你掌握了Linux下高效文件管理和数据备份的关键。

解决方案

使用

tar
命令进行文件压缩和解压,核心在于几个关键选项的组合。

1. 创建并压缩文件/目录(打包+压缩):

这是最常用的场景,比如你需要把一个项目目录打包发给同事,或者备份某个重要的数据。

tar -czvf my_archive.tar.gz /path/to/my_directory/
  • -c
    (create): 创建一个新的归档文件。
  • -z
    (gzip): 通过gzip算法压缩归档文件。这会生成
    .gz
    后缀的文件,也是最常见的压缩格式,兼顾速度和压缩比。
  • -v
    (verbose): 显示
    tar
    命令处理的每一个文件,让你知道它在做什么,尤其是在处理大量文件时,这能提供很好的反馈。
  • -f
    (file): 指定归档文件的名称。
    my_archive.tar.gz
    就是你最终得到的压缩文件。
  • /path/to/my_directory/
    : 这是你想要打包和压缩的源目录或文件。你也可以指定多个文件或目录,用空格隔开。

如果你想用更强的压缩算法,比如

bzip2
xz
,只需要将
-z
替换为
-j
(bzip2) 或
-j
(xz)。

  • 使用bzip2压缩:
    tar -cjvf my_archive.tar.bz2 /path/to/my_directory/
  • 使用xz压缩(通常压缩比最高,但速度最慢):
    tar -cJvf my_archive.tar.xz /path/to/my_directory/

2. 解压文件(解包+解压缩):

当你收到一个

.tar.gz
文件,或者需要恢复你的备份时,就需要解压。

tar -xzvf my_archive.tar.gz
  • -x
    (extract): 从归档文件中提取文件。
  • -z
    (gzip): 告知
    tar
    这是一个gzip压缩的归档文件,需要先解压缩。
  • -v
    (verbose): 显示解压过程。
  • -f
    (file): 指定要解压的归档文件。

同样,如果你的文件是

.tar.bz2
.tar.xz
,你需要相应地替换
-z

  • 解压bzip2文件:
    tar -xjvf my_archive.tar.bz2
  • 解压xz文件:
    tar -xJvf my_archive.tar.xz

3. 查看归档文件内容:

在解压之前,你可能想知道归档文件里到底有什么。

tar -tzvf my_archive.tar.gz
  • -t
    (list): 列出归档文件中的内容,而不进行实际解压。
  • -z
    -v
    -f
    的作用同上。

这几个命令基本上能覆盖你日常使用

tar
的90%需求。我个人在做服务器备份的时候,通常会选择
gzip
,因为它速度快,对于大多数文件类型来说,压缩比也足够了。如果是那种长期归档、对存储空间极度敏感的数据,才会考虑
xz

tar命令与gzip、bzip2、xz:我该如何选择压缩算法?

选择

tar
命令与哪种压缩算法结合,其实是个权衡游戏:速度、压缩比和系统资源消耗。这就像你在选择旅行方式,是追求最快抵达(
gzip
),还是愿意花更多时间但能带更多行李(
xz
),亦或是折中一下(
bzip2
)。

从我的经验来看,大多数日常操作,比如备份配置文件、传输小型项目目录,

gzip
(
-z
) 是首选。它的压缩和解压速度都非常快,对于CPU和内存的占用也相对较低。虽然压缩比不是最高的,但对于文本文件、代码库这类内容,通常也能达到不错的压缩效果。如果你频繁地需要打包和解包,或者在资源有限的环境下工作,
gzip
无疑是效率的保证。

bzip2
(
-j
) 则提供了一个中庸之道。它的压缩比通常比
gzip
好一些,但压缩和解压速度会慢上不少,对系统资源的需求也更高。我会在需要稍好压缩比,但又不想等太久的情况下使用它。比如,备份一个不是特别大,但希望尽可能节省一点空间的数据集。它的
.bz2
后缀也挺常见的,所以在兼容性上不用担心。

xz
(
-j
),则是追求极致压缩比的终极选择。它的压缩效率通常是三者中最高的,能将文件压得最小。但代价是显而易见的:压缩和解压速度都非常慢,而且在压缩过程中可能会占用大量的CPU和内存资源。这使得它更适合那些“一次压缩,长期存储”的场景,比如系统镜像、大型数据库备份(在不追求实时恢复的情况下),或者你真的对存储空间锱铢必较。我个人很少在生产环境的实时备份中使用
xz
,因为它可能会显著延长备份窗口,甚至影响系统性能。但在归档旧数据到冷存储时,它就成了香饽饽。

总结一下,我的选择哲学是:

  • 日常备份/频繁操作:
    gzip
    (
    -z
    ),速度优先。
  • 中等存储需求/偶尔操作:
    bzip2
    (
    -j
    ),平衡速度与压缩比。
  • 长期归档/极致压缩:
    xz
    (
    -j
    ),空间优先,时间次之。

了解这些差异,能让你在不同的场景下做出最合适的选择,而不是盲目地使用某一种。

除了压缩,tar在日常备份中还有哪些高级用法?

tar
命令的强大之处远不止简单的打包压缩。在日常的系统维护和数据备份中,它还有一些非常实用的高级用法,能帮助你更灵活、更精确地控制备份内容。

1. 排除特定文件或目录 (

--exclude
):

这是我个人在做系统备份时最常用的一个功能。比如,你备份

/var
目录,但不想把日志文件(通常在
/var/log
)或者缓存文件(
/var/cache
)也打包进去,因为它们可能非常大,而且通常不需要恢复。

tar -czvf backup.tar.gz /var --exclude='/var/log' --exclude='/var/cache'

你可以多次使用

--exclude
来排除多个路径。它也支持通配符,比如排除所有
.tmp
文件:
--exclude='*.tmp'
。这对于保持备份文件的精简,避免不必要的垃圾数据非常有用。

2. 仅打包特定类型的文件:

有时候你只想备份某个目录下的所有

.conf
文件,或者所有图片文件。

花生AI
花生AI

B站推出的AI视频创作工具

下载
tar -czvf config_files.tar.gz -C /etc --include='*.conf' .

这里的

-C /etc
是先切换到
/etc
目录再执行打包,
--include='*.conf'
则指定只包含
.conf
文件。最后的
.
表示当前目录(即
/etc
)。需要注意的是,
--include
通常需要与
--exclude
结合使用,或者在
-c
选项后使用。单纯的
--include
在没有
--exclude
的情况下,可能会导致
tar
包含所有文件。更稳妥的做法是,先切换到目标目录,然后指定要打包的文件模式。

3. 将归档文件解压到指定目录 (

-c
):

默认情况下,

tar
会将文件解压到当前工作目录。但很多时候,你希望将文件解压到其他位置,而不是当前目录弄得一团糟。

tar -xzvf my_archive.tar.gz -C /path/to/destination_directory/

-c
选项在解压时非常方便,它会先改变到指定的目录,然后再进行解压操作。这确保了你的文件被放置在正确的位置,避免了手动移动的麻烦。

4. 增量备份 (

--listed-incremental
):

对于大型数据集,每次都做完整备份既耗时又占用大量空间。

tar
支持增量备份,只备份自上次完整备份或增量备份以来发生变化的文件。

# 第一次完整备份
tar -czvf full_backup.tar.gz -g /var/backup_snapshot.snar /path/to/data/

# 之后进行增量备份
tar -czvf incremental_backup_1.tar.gz -g /var/backup_snapshot.snar /path/to/data/

这里的

-g
--listed-incremental
选项需要一个“快照文件”(
.snar
文件)。
tar
会读取这个文件来判断哪些文件发生了变化。这个功能相对复杂一些,需要仔细管理快照文件,但对于需要长期、高效备份的场景来说,它能显著减少备份时间和存储需求。不过,我个人在做增量备份时,更倾向于
rsync
,因为它在处理增量和同步方面更为直观和强大。但
tar
的增量备份在某些特定场景下依然有用。

这些高级用法让

tar
不仅仅是一个简单的压缩工具,更是一个强大的备份管理利器。合理运用它们,能让你的文件管理工作事半功倍。

处理大型tar归档文件时,有哪些常见的陷阱或性能优化策略?

处理大型

tar
归档文件时,确实会遇到一些挑战,比如操作时间过长、磁盘空间不足、甚至文件损坏等。这些问题往往需要一些策略和工具来应对,否则可能会让你感到沮丧。

1. 缺乏进度指示:

这是最常见的一个“陷阱”。当你执行

tar
命令处理一个几百GB的目录时,命令行可能会长时间没有任何输出,让你不知道它到底在干什么,是卡住了还是在努力工作。这会让人非常焦虑。

优化策略:使用

pv
命令显示进度。
pv
(Pipe Viewer) 是一个非常实用的工具,它可以在管道中显示数据传输的进度。

tar -c /path/to/large/directory | pv -s $(du -sh /path/to/large/directory | awk '{print $1}') | gzip > large_archive.tar.gz

这里的

pv -s $(du -sh /path/to/large/directory | awk '{print $1}')
会估算源目录的大小,并在
tar
命令处理时显示进度条、传输速度和预计剩余时间。这能极大地提升用户体验,让你对操作进程一目了然。

2. 单个归档文件过大,传输或存储不便:

一个几百GB甚至上TB的

.tar.gz
文件,在某些文件系统上可能遇到限制,或者在传输到其他存储介质时非常不便。

优化策略:分卷压缩。 你可以将一个大型归档文件拆分成多个较小的部分。这通常通过将

tar
的输出通过管道传递给
split
命令来实现。

tar -czf - /path/to/large/directory | split -b 1G - large_archive.tar.gz.
  • tar -czf - ...
    -f -
    表示将
    tar
    的输出发送到标准输出(stdout)。
  • split -b 1G
    :将输入分割成每个文件大小为1GB的小块。
  • large_archive.tar.gz.
    :这是分卷文件的前缀,例如会生成
    large_archive.tar.gz.aa
    ,
    large_archive.tar.gz.ab
    等。

解压时,你需要先将这些分卷文件合并,然后再解压:

cat large_archive.tar.gz.* | tar -xzvf -

3. 归档文件损坏的风险:

在传输或存储过程中,大型文件更容易出现数据损坏,导致整个归档文件无法解压。

优化策略:生成校验和。 在创建归档文件后,立即计算其MD5或SHA256校验和,并将其与归档文件一起存储。在需要解压时,先验证校验和是否一致。

tar -czvf large_archive.tar.gz /path/to/large/directory
md5sum large_archive.tar.gz > large_archive.tar.gz.md5
sha256sum large_archive.tar.gz > large_archive.tar.gz.sha256

解压前,运行

md5sum -c large_archive.tar.gz.md5
sha256sum -c large_archive.tar.gz.sha256
。如果返回“OK”,则文件完整;否则,文件可能已损坏。这虽然不能修复损坏,但能及时发现问题,避免在解压失败后才发现数据不完整。

4. 处理大量小文件时的性能问题:

tar
在处理大量小文件时,性能可能会比处理少量大文件差。因为每个文件都需要单独的元数据处理。

优化策略:打包前进行预处理或考虑其他工具。 如果可能,可以考虑将大量小文件先打包成几个大文件,再进行

tar
压缩。或者,对于这种场景,
rsync
在同步大量小文件方面可能表现更好,因为它只传输差异部分。但如果必须使用
tar
,确保你的磁盘IO和CPU资源充足。

这些策略能够帮助你更从容地应对大型

tar
归档文件带来的挑战,确保数据安全和操作效率。在实际工作中,我发现预估文件大小、使用
pv
监控进度以及生成校验和,这三点是处理大型归档文件时最能带来安全感和效率提升的实践。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

185

2023.09.27

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

403

2023.08.14

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

348

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2074

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

410

2023.10.16

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.5万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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