如何实现按原目录结构迁移备份文件?

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
没有评论

发表回复

Linux基础
如何熟悉值得收藏的项目?

火爬 ————— https://git …

Linux基础
如何解决su命令源限制报错?

1 前言 一个问题,一篇文章,一出故事。 笔者最近使用如下命令切换用户, su – tidb 收到如 …

Linux基础
如何安装DBeaver的旧版本MySQL驱动?

1 前言 一个问题,一篇文章,一出故事。 最近笔者的DBeaver 24.1.5需要连接一台很老旧的 …