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

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

发表回复

Bash
如何Telnet自动登录路由器执行命令?

1 前言 一个问题,一篇文章,一出故事。 最近在笔者需要一个脚本自动从路由读取一些信息,因此整理本章 …

Linux基础
如何切换Oracle Linux到红帽兼容内核?

1 基础知识 – RHCK是Red Hat Compatible Kernel的英文缩写 …

Linux基础
如何解决tabby-terminal秘钥交换错误提示II?

1 前言 一个问题,一篇文章,一出故事。 笔者使用Tabby Terminal连接旧的Linux服务 …