
Bash
1 前言
一个问题,一篇文章,一出故事。
笔者最近需要实现将sftp的数据按照原目录结构迁移备份到备份文件夹,因此整理此脚本。
2 最佳实践
2.1 创建脚本
vim ~/scripts/moveBackupFiles.sh
加入如下配置,
#!/bin/bash dataDir="/data/sftp" bakDir="/backup/sftp" daysOld=180 # 定义要查找的天数 cleanupDays=365 # 定义清理数据的天数 logMoveFile="/var/log/moveBackupFiles.log" # 定义移动日志文件路径 logMoveError="/var/log/moveBackupError.log" # 定义错误日志文件路径 # 检查 /backup/sftp 目录是否可用 cd "$bakDir" || { echo "$(date '+%Y-%m-%d %H:%M:%S') - Cannot access $bakDir. Exiting." | tee -a "$logMoveError"; exit 1; } # 确保日志文件可写 touch "$logMoveFile" "$logMoveError" || { echo "Cannot write to log files. Exiting." | tee -a "$logMoveError"; exit 1; } # 查找所有名为 myhome 的目录 find "$dataDir" -type d -name myhome | while read -r dir; do # 查找指定天数前的文件 find "$dir" -type f -ctime "+$daysOld" -print0 | while read -r -d '' file; do # 构建目标路径 targetDir="$bakDir/${file#$dataDir/}" targetDir="$(dirname "$targetDir")" # 创建目标目录 mkdir -p "$targetDir" || { echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to create directory: $targetDir" | tee -a "$logMoveError"; exit 1; } # 移动文件 mv "$file" "$targetDir" || { echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to move file: $file" | tee -a "$logMoveError"; exit 1; } # 记录成功移动的文件 echo "$(date '+%Y-%m-%d %H:%M:%S') - Moved file: $file to $targetDir" >> "$logMoveFile" done done # 清理超过 365 天的数据 find "$bakDir" -type f -ctime "+$cleanupDays" -print0 | while read -r -d '' old_file; do rm -f "$old_file" && echo "$(date '+%Y-%m-%d %H:%M:%S') - Deleted file: $old_file" >> "$logMoveFile" || \ echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to delete file: $old_file" | tee -a "$logMoveError" done exit 0
2.2 测试脚本执行
bash ~/scripts/moveBackupFiles.sh
2.3 设置计划任务
crontab -e
加入如下设置,
0 3 * * * bash ~/scripts/moveBackupFiles.sh
没有评论