定时同步文件夹到备份盘脚本

wen 实用脚本 2

本文目录导读:

定时同步文件夹到备份盘脚本

  1. 方案1:Linux rsync + cron (最常用)
  2. 方案2:Windows PowerShell + 任务计划程序
  3. 方案3:使用 Systemd Timer (Linux现代方法)
  4. 方案4:使用高级备份脚本(带版本控制)
  5. 使用建议

方案1:Linux rsync + cron (最常用)

同步脚本 (backup.sh)

#!/bin/bash
# 配置
SOURCE_DIR="/path/to/source"  # 源文件夹
BACKUP_DIR="/path/to/backup"  # 备份盘路径
LOG_FILE="/var/log/backup.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# 创建日志记录函数
log() {
    echo "[$DATE] $1" >> "$LOG_FILE"
}
# 检查备份盘是否挂载
if [ ! -d "$BACKUP_DIR" ]; then
    log "错误: 备份目录 $BACKUP_DIR 不存在"
    exit 1
fi
# 执行同步
log "开始同步..."
rsync -avz --delete "$SOURCE_DIR/" "$BACKUP_DIR/" >> "$LOG_FILE" 2>&1
# 检查同步结果
if [ $? -eq 0 ]; then
    log "同步完成"
else
    log "同步失败"
fi

设置cron定时任务

# 编辑crontab
crontab -e
# 添加以下行(每2小时同步一次)
0 */2 * * * /path/to/backup.sh
# 常见定时示例:
# 每天凌晨2点: 0 2 * * * /path/to/backup.sh
# 每小时: 0 * * * * /path/to/backup.sh
# 每周日22点: 0 22 * * 0 /path/to/backup.sh
# 每30分钟: */30 * * * * /path/to/backup.sh

方案2:Windows PowerShell + 任务计划程序

PowerShell脚本 (backup.ps1)

# 配置
$SourcePath = "C:\SourceFolder"
$BackupPath = "D:\BackupFolder"
$LogFile = "C:\Logs\backup.log"
# 日志函数
function Write-Log {
    param([string]$Message)
    $Time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$Time $Message" | Out-File -FilePath $LogFile -Append
}
# 创建备份目录(如果不存在)
if (-not (Test-Path $BackupPath)) {
    Write-Log "错误: 备份目录 $BackupPath 不存在"
    exit 1
}
# 使用Robocopy同步
Write-Log "开始同步..."
$RobocopyArgs = @(
    $SourcePath, $BackupPath
    "/MIR",           # 镜像模式(包括删除)
    "/R:3",           # 重试次数
    "/W:10",          # 等待时间
    "/NP",            # 不显示进度
    "/NDL",           # 不记录目录
    "/LOG+:$LogFile"  # 追加日志
)
$Result = Start-Process -FilePath "robocopy.exe" -ArgumentList $RobocopyArgs -Wait -NoNewWindow
if ($Result.ExitCode -le 7) {
    Write-Log "同步完成"
} else {
    Write-Log "同步失败 (错误码: $($Result.ExitCode))"
}

设置Windows任务计划

# 创建定时任务(每2小时运行一次)
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-WindowStyle Hidden -File C:\Scripts\backup.ps1"
$Trigger = New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Hours 2) `
    -RepetitionDuration (New-TimeSpan -Days 365) `
    -At (Get-Date "00:00:00") -Once
$Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount
Register-ScheduledTask -TaskName "文件夹同步备份" `
    -Action $Action -Trigger $Trigger -Principal $Principal

方案3:使用 Systemd Timer (Linux现代方法)

创建服务单元 (/etc/systemd/system/backup.service)

[Unit]
Description=文件夹同步备份服务
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/rsync -avz --delete /源文件夹/ /备份盘/
StandardOutput=journal
StandardError=journal

创建定时器 (/etc/systemd/system/backup.timer)

[Unit]
Description=每2小时定时同步备份
[Timer]
OnCalendar=*-*-* 00/2:00:00
Persistent=true
[Install]
WantedBy=timers.target

启用定时器

systemctl daemon-reload
systemctl enable --now backup.timer
systemctl start backup.timer

方案4:使用高级备份脚本(带版本控制)

#!/bin/bash
# 高级备份脚本
SOURCE="/data/important"
BACKUP_BASE="/backup"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG="/var/log/backup_${TIMESTAMP}.log"
echo "=== 开始增量备份 ===" | tee -a $LOG
# 1. 创建快照备份
rsync -avz --link-dest="$BACKUP_BASE/latest" \
    "$SOURCE/" "$BACKUP_BASE/$TIMESTAMP/" | tee -a $LOG
# 2. 更新最新版本链接
ln -sfn "$BACKUP_BASE/$TIMESTAMP" "$BACKUP_BASE/latest"
# 3. 清理旧备份
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +$RETENTION_DAYS \
    ! -name "latest" -exec rm -rf {} \;
echo "备份完成,保留最近${RETENTION_DAYS}天的版本" | tee -a $LOG

使用建议

  1. 首次运行前测试

    # Linux测试
    bash -x backup.sh  # 调试模式运行
    # Windows测试
    Set-ExecutionPolicy RemoteSigned
    .\backup.ps1
  2. 添加邮件通知(Linux):

    rsync ... && echo "备份成功" | mail -s "备份报告" user@example.com
  3. 排除特定文件

    rsync --exclude="*.tmp" --exclude="cache/" ...

选择适合你系统的方案,记得先测试确保一切正常,需要调整定时频率可以在cron或任务计划中修改。

抱歉,评论功能暂时关闭!