本文依旧属于 Linux 文件管理的基础内容,将深入解析 Linux 系统中归档与压缩的核心工具,举例说明
tar命令的实战技巧与场景应用,旨在帮助读者掌握高效数据整理与备份文件的实用技能。
[本文基于 CentOS Linux release 7 系统环境]
前情提要:通过往期文章《【Linux·基础篇】Shell 基础|常用命令·归档与压缩(一)》的内容,我们了解了归档和压缩的基本概念以及 tar 命令的基本使用方法。
tar 命令的实战技巧与场景应用举例在创建归档时,我们可以指定排除一些特定的内容(文件或目录)。
# 创建归档时排除特定文件类型tar -cvf clean_backup.tar --exclude='*.log' --exclude='tmp/*' /data/tar -czvf project.tar.gz --exclude='node_modules' --exclude='*.log' project/ # 创建归档时排除 node_modules 目录和 .log 文件选项说明:
--exclude='pattern':排除匹配指定模式的文件我们可以不提取归档文件,快速浏览、搜索、统计归档内容。
# 搜索归档中的特定文件tar -tf archive.tar | grep "config"# 统计归档信息tar -tvf archive.tar | awk 'BEGIN{count=0;size=0} {count++;size+=$3} END{print "文件数:", count, "总大小:", size/1024/1024, "MB"}'命令说明:
| 和 grep:组合使用搜索特定内容awk 命令:用于统计和计算归档信息增量备份就是只保存自上一次备份(全量或增量)以来新增或修改的文件。
基于时间的增量备份方式只备份自指定日期以来修改过的文件数据。这种方式通过比较文件的修改时间(mtime)来确定需要备份的文件。
# 创建基于时间戳的增量备份:创建一个压缩归档文件,其中只包含自 2024 年 1 月 15 日以来修改过的 /var/log/ 目录中的文件tar -czvf changes_since_yesterday.tar --newer="2024-01-15" /var/log/选项说明:
--newer="date":仅归档指定日期之后修改的文件。基于快照文件的增量备份方式只备份自上次快照后发生变化的文件数据。第一次备份时,快照文件不存在,会创建完整备份;后续备份会根据快照文件只备份变化的文件。
① 创建完整备份和初始快照:会创建备份文件,并同时生成快照文件(记录文件系统状态)。
tar -czvf full_backup_20240101.tar.gz -g snapshot.snar /data/ # snapshot.snar 是快照文件tar -czvf full_backup_$(date +%Y%m%d).tar.gz --listed-incremental=backup.snar /data/ # backup.snar 是快照文件② 创建增量备份:指定之前的备份的快照文件,只打包自上次备份以来发生变化的文件。
tar -czvf inc_backup_20240102.tar.gz -g snapshot.snar /data/tar -czvf inc_backup_$(date +%Y%m%d).tar.gz --listed-incremental=backup.snar /data/③ 恢复数据(备份序列):恢复时必须按照备份的顺序依次恢复所有备份,以确保数据的完整性和一致性。这主要是因为增量备份记录的是自上次备份(无论是全量还是增量)以来发生变化的数据。
# 先恢复完整备份tar -xzvf full_backup_20240101.tar.gz -C /restore/path# 再依次应用所有增量备份tar -xzvf inc_backup_20240102.tar.gz -C /restore/path选项说明:
-g、--listed-incremental=FILE:使用快照文件记录备份状态。tar 会对比当前文件系统与该快照文件中的记录,仅打包那些自上次备份后被修改、新增或删除的文件,从而大大减少备份所需的时间和存储空间。-g 本身只负责识别哪些文件需要备份,不负责压缩。通常会与 -z(gzip)、-j(bzip2)等压缩选项联合使用。backup.snap),该文件由 tar 自动创建和管理,不能手动删除或修改。-g 时,如果快照文件不存在,tar 会自动创建一个空快照文件,并执行一次完整备份。tar 都会执行增量备份,只包含变化的部分。多卷归档就是将大型归档分割为多个固定大小的卷,便于存储到容量有限的介质。
# 创建每卷 100MB 的多卷归档tar -cvM --tape-length=102400 -f archive.tar /large_dataset/# 恢复多卷归档时,如果所有卷都在当前目录,可以使用管道避免交互cat archive.tar archive.tar-2 archive.tar-3 | tar -xvf -选项说明:
-M:创建/提取多卷归档(multi-volume)--tape-length:指定每卷的大小(字节)-b:指定分割块大小另一种分割方式是使用 split 命令(通用文件分割工具)。
# 打包并分割tar -cvf - /data | split -b 100M - archive_part_# 合并并解压cat archive_part_* | tar -xvf -目的:将本地服务器数据备份并传输至远程服务器。
# 通过 SSH 远程备份tar -czf - /local | ssh user@remote "cat > /backup/backup.tar.gz"选项说明:
-f -:指定归档文件为标准输出(- 表示 stdout)命令分解与工作流程如下:
tar -czf - /local,即 tar 命令将 /local 目录打包压缩,并将结果输出到标准输出。| 将压缩后的数据流传输到远程服务器。ssh user@remote "cat > /backup/backup.tar.gz",即 SSH 连接到远程服务器,使用 cat 命令将接收到的数据写入 /backup/backup.tar.gz 文件如果备份数据已打包,那么也常会用到以下命令:
ssh user@remote "tar -xzf - -C /backup" < backup.tar.gz命令分解与工作流程如下:
backup.tar.gz 文件作为输入数据源ssh user@remote "tar -xzf - -C /backup",即在远程服务器上将接收到的数据流解压到 /backup 目录目的:将远程服务器数据备份并传输至本地服务器。
# 从远程恢复ssh user@remote "tar -czf - /backup" | tar -xzf - -C /local命令分解与工作流程如下:
ssh user@remote "tar -czf - /backup",即 SSH 连接到远程服务器,将 /backup 目录打包压缩并输出到标准输出| 将压缩数据流传输到本地tar -xzf - -C /local,即在本地服务器上将接收到的压缩数据流解压到 /local 目录还有一些其它的常用操作,如下:
# 快速创建当前目录的备份tar -czf backup_$(date +%Y%m%d_%H%M%S).tar.gz .# 批量解压当前目录所有 .tar.gz 文件for f in *.tar.gz; do tar -xzvf "$f"; done# 查看压缩文件大小du -h archive.tar.gztar 命令作为常用的文件管理工具,具有很强的灵活性:
--exclude 可过滤特定文件(如日志)进行归档;结合 grep 或 awk 命令可高效查看与统计归档内容;--newer)或快照文件(-g)仅备份变化数据,大幅提升备份效率;-M)或与 split 命令配合分割;tar 能与管道 | 和 SSH 无缝结合,实现本地与远程服务器间的流式压缩传输与解压,从而无需落盘即可完成远程备份与恢复。此外,配合日期变量和循环,还能轻松实现批量自动化操作,使其成为应对复杂归档、备份和迁移任务的综合解决方案。
如果你对本文中像管道、SSH 等这些内容感到陌生或难以理解,请不用担心,此处可以先将它们作为了解内容,暂时不必深究。我在本文中举例时使用它们,一是在工作中确实常会如此使用,二是为了知识内容的完整性并为后续行文作铺垫。相信我们通过不断深入地了解和学习 Linux 系统,一些疑惑终会解开。
此番炼器手札,炉火尚未全熄。若道友观之有趣,或可暂留此间,结一尘缘。待下回开炉铸器,新得感悟,必先与同道分享。