如何实现按原目录结构迁移备份文件?
- By : Will
- Category : Bash, FTP & SFTP & FTPS, Linux基础, 脚本备份
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")"
targetFile="$bakDir/${file#$dataDir/}"
# 创建目标目录
mkdir -p "$targetDir" || { echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to create directory: $targetDir" | tee -a "$logMoveError"; exit 1; }
# 检查目标文件是否存在
if [ -e "$targetFile" ]; then
# 如果文件已存在,执行另存为
baseName=$(basename "$file")
newFileName="$targetDir/${baseName%.*}_$(date +%Y%m%d%H%M%S).${baseName##*.}"
mv "$file" "$newFileName" || { echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to move file: $file to $newFileName" | tee -a "$logMoveError"; exit 1; }
echo "$(date '+%Y-%m-%d %H:%M:%S') - Moved file: $file to $newFileName" >> "$logMoveFile"
else
# 如果文件不存在,正常移动
mv "$file" "$targetFile" || { 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 $targetFile" >> "$logMoveFile"
fi
done
done
exit
# 清理超过 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
没有评论