Featured image of post Linux 完整目录备份与解压自动化脚本 📂

Linux 完整目录备份与解压自动化脚本 📂

Linux 完整目录备份与解压自动化脚本 📂 本文详细介绍通用自动备份脚本的

Linux 完整目录备份与解压自动化脚本 📂

本文详细介绍通用自动备份脚本的功能、使用方法及恢复指南,帮助您轻松管理重要数据的安全。


📋 导航目录


📦 脚本概述

通用自动备份脚本是一个高效的数据保护工具,能够自动化完成目录的压缩备份、版本管理和旧备份清理工作。通过简单的命令即可实现一键备份,确保您的数据安全无忧。


一、 ✨ 备份脚本功能与特点

  • 完全免交互:适合自动化任务和定时执行
  • 智能保留策略:自动保留指定数量的最新备份文件
  • 时间戳标识:每个备份文件包含精确到秒的创建时间
  • 完整性检查:自动验证源目录和备份目录的可用性
  • 详细日志输出:实时显示备份进度和结果
  • 空间管理:自动清理旧备份,避免磁盘空间不足

二、📦 解压命令功能与特点

  • 灵活解压:支持解压到当前目录、指定目录,满足不同场景需求
  • 内容预览:可在解压前查看归档文件内容,避免覆盖重要文件
  • 选择性解压:支持从大型备份中提取单个或特定目录的文件
  • 权限保持:完整保留文件原始权限、所有权及时间戳属性
  • 进度可视化:使用-v参数可显示解压过程的详细文件列表
  • 通用性强:标准tar/gzip格式,兼容所有Linux/Unix系统及常见解压软件

三、🔧 使用方法

1. 远程执行方式(压缩与解压)

  • 基本命令格式 bash ~/universal_backup.sh <源目录> <备份目录> [保留数量]
  • 备份目录下仅保留 源目录名_时间戳.tar.gz 格式压缩包,每包即源目录的完整备份。

📦 远程压缩操作

1
2
3
4
5
# 使用主域名执行
bash <(curl -sL script.meimolihan.eu.org/sh/backup/universal_backup.sh) /源目录 /备份目录 保留数量

# 或使用Gitee镜像执行(国内用户推荐)
bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/backup/universal_backup.sh) /源目录 /备份目录 保留数量

📤 本地解压操作

1
2
3
4
5
# 解压到当前目录
tar -xzvf /备份目录/备份文件.tar.gz

# 解压到指定目录
tar -xzvf /备份目录/备份文件.tar.gz -C /目标目录/
  • 实际解压示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 解压到当前目录(会在当前目录创建原目录结构)
tar -xzvf /backups/html_20231201_143022.tar.gz

# 解压到指定目录
tar -xzvf /backups/html_20231201_143022.tar.gz -C /var/www/new_html/

# 只查看归档内容而不解压
tar -tzvf /backups/html_20231201_143022.tar.gz

# 解压特定文件
tar -xzvf /backups/html_20231201_143022.tar.gz path/to/specific/file
  • 解压参数详解
    • -x:从归档中解压文件
    • -z:使用gzip解压缩
    • -v:显示详细处理过程
    • -f:指定归档文件名
    • -C:指定解压目标目录

💻 2. 本地执行方式(压缩与解压)

📦 本地压缩操作

  • 基本命令格式 bash ~/universal_backup.sh <源目录> <备份目录> [保留数量]
  • 备份目录下仅保留 源目录名_时间戳.tar.gz 格式压缩包,每包即源目录的完整备份。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 下载备份脚本
cd /mnt && \
wget -c https://gitee.com/meimolihan/script/raw/master/sh/backup/universal_backup.sh

# 赋予执行权限
chmod +x universal_backup.sh

# 解决可能存在的换行符问题(如果需要)
sudo apt install dos2unix
dos2unix universal_backup.sh

# 基本用法(保留3个备份)
/mnt/universal_backup.sh  /源目录 /备份目录

# 指定保留备份数量
/mnt/universal_backup.sh /源目录 /备份目录 保留数量

# 实际示例
/mnt/universal_backup.sh /mnt/test1 /mnt/test2
/mnt/universal_backup.sh /mnt/test1 /mnt/test2 7

📤 本地解压操作

1
2
3
4
5
# 解压到当前目录
tar -xzvf /备份目录/备份文件.tar.gz

# 解压到指定目录
tar -xzvf /备份目录/备份文件.tar.gz -C /目标目录/
  • 实际解压示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 解压到当前目录(会在当前目录创建原目录结构)
tar -xzvf /backups/html_20231201_143022.tar.gz

# 解压到指定目录
tar -xzvf /backups/html_20231201_143022.tar.gz -C /var/www/new_html/

# 只查看归档内容而不解压
tar -tzvf /backups/html_20231201_143022.tar.gz

# 解压特定文件
tar -xzvf /backups/html_20231201_143022.tar.gz path/to/specific/file
  • 解压参数详解
    • -x:从归档中解压文件
    • -z:使用gzip解压缩
    • -v:显示详细处理过程
    • -f:指定归档文件名
    • -C:指定解压目标目录

四、🔍 测试压缩与解压

以下是一个完整的测试流程,展示如何使用这两个脚本进行压缩和解压操作:

🧪 1. 创建测试文件

1
2
3
4
5
6
mkdir -p /mnt/{test1,test2,test3} && \
mkdir -p /mnt/test1/{aaa,bbb,ccc} && \
echo "测试文件内容" > /mnt/test1/aaa/test1.txt && \
echo "另一个测试文件" > /mnt/test1/bbb/test2.txt && \
echo "第三个测试文件" > /mnt/test1/ccc/test3.txt && \
tree /mnt/test1 /mnt/test2 /mnt/test3
  • 初始测试目录结构
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@debian13 / # tree /mnt/test1 /mnt/test2 /mnt/test3
/mnt/test1
├── aaa
│   └── test1.txt
├── bbb
│   └── test2.txt
└── ccc
    └── test3.txt
/mnt/test2
/mnt/test3

🧪 2. 测试 压缩

  • 这里指定了 保留数量 5,默认是保留数量 3
1
bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/backup/universal_backup.sh) /mnt/test1 /mnt/test2 5 && tree /mnt/test1 /mnt/test2 /mnt/test3
  • 完成 压缩 后的目录结构
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
root@debian13 / # tree /mnt/test1 /mnt/test2 /mnt/test3
/mnt/test1
├── aaa
│   └── test1.txt
├── bbb
│   └── test2.txt
└── ccc
    └── test3.txt
/mnt/test2
└── test1_20250916_193521.tar.gz
/mnt/test3

🧪 3. 测试 解压

1
tar -xzvf /mnt/test2/test1_*.tar.gz -C /mnt/test3/ && tree /mnt/test1 /mnt/test2 /mnt/test3
  • 完成 解压 后的目录结构
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
root@debian13 ~ # tree /mnt/test1 /mnt/test2 /mnt/test3
/mnt/test1
├── aaa
│   └── test1.txt
├── bbb
│   └── test2.txt
└── ccc
    └── test3.txt
/mnt/test2
└── test1_20250916_193521.tar.gz
/mnt/test3
└── test1
    ├── aaa
    │   └── test1.txt
    ├── bbb
    │   └── test2.txt
    └── ccc
        └── test3.txt

🧪 4. 删除测试文件

1
2
rm -rf /mnt/test1 /mnt/test2 /mnt/test3 && \
ls /mnt

这个测试流程展示了:

  1. 创建测试目录结构和文件
  2. 使用备份脚本将目录压缩为一个tar.gz文件
  3. 使用解压脚本将这些压缩包解压到目标目录
  4. 验证解压结果是否正确

通过这个完整的测试流程,您可以确保脚本正常工作,并且理解整个压缩和解压的过程。🧪


五、📁 备份原理与压缩机制

压缩技术

脚本使用标准的 targzip 工具进行压缩,具有以下特点:

  • 高压缩比:gzip压缩算法在保证速度的同时提供良好的压缩率
  • 广泛兼容:tar.gz格式在所有Linux/Unix系统上均可直接处理
  • 保留权限:完整保留文件权限、所有权和时间戳信息

备份流程

  1. 参数验证:检查源目录是否存在,备份目录是否可写
  2. 压缩创建:使用 tar -czf 命令创建gzip压缩的归档文件
  3. 文件命名:采用"目录名_年月日_时分秒.tar.gz"格式
  4. 清理策略:按时间排序备份文件,保留最新的N个文件
  5. 结果报告:显示备份大小和当前保留的备份列表

六、⏰ 定时任务设置

设置定时自动备份

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 编辑当前用户的crontab
crontab -e

# 添加以下任务示例:
# 每天凌晨2点执行备份,保留7个备份
0 2 * * * /path/to/universal_backup.sh /var/www/html /backups 7

# 每周日凌晨1点执行备份,保留4个备份
0 1 * * 0 /path/to/universal_backup.sh /home/user/documents /mnt/backup 4

# 每6小时执行一次备份
0 */6 * * * /path/to/universal_backup.sh /important/data /backups 10

日志记录配置

1
2
3
4
5
# 将输出同时记录到日志文件
0 2 * * * /path/to/universal_backup.sh /var/www/html /backups 7 >> /var/log/backup.log 2>&1

# 只记录错误信息
0 2 * * * /path/to/universal_backup.sh /var/www/html /backups 7 > /dev/null 2>> /var/log/backup-error.log

七、💡 注意事项

  1. 权限要求:运行脚本的用户需要对源目录有读取权限,对备份目录有写入权限
  2. 磁盘空间:确保备份目录有足够的空间存储备份文件
  3. 路径规范:建议使用绝对路径,避免相对路径可能带来的问题
  4. 特殊字符:目录名中避免使用特殊字符,以免影响脚本执行
  5. 文件系统:对于大量小文件,压缩过程可能较慢,建议在系统负载低时执行
  6. 网络备份:如需备份到远程位置,可先本地备份再使用rsync同步

性能优化建议

  • 对于大型目录,考虑使用更高效的压缩算法(如pigz)
  • 使用ionicenice调整备份任务的IO和CPU优先级
  • 对于数据库应用,建议先停止服务或使用专用备份工具

恢复测试建议

定期测试备份文件的恢复过程,确保:

  • 备份文件完整无损
  • 恢复后的文件权限正确
  • 重要数据没有遗漏

🚀 定期备份是数据安全的重要保障,建议您设置定时任务自动执行此脚本,为您的重要数据提供持续的保护。定期测试恢复流程,确保在需要时能够快速有效地恢复数据。