本文目录导读:

- 方案1:Linux rsync + cron (最常用)
- 方案2:Windows PowerShell + 任务计划程序
- 方案3:使用 Systemd Timer (Linux现代方法)
- 方案4:使用高级备份脚本(带版本控制)
- 使用建议
方案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
使用建议
-
首次运行前测试:
# Linux测试 bash -x backup.sh # 调试模式运行 # Windows测试 Set-ExecutionPolicy RemoteSigned .\backup.ps1
-
添加邮件通知(Linux):
rsync ... && echo "备份成功" | mail -s "备份报告" user@example.com
-
排除特定文件:
rsync --exclude="*.tmp" --exclude="cache/" ...
选择适合你系统的方案,记得先测试确保一切正常,需要调整定时频率可以在cron或任务计划中修改。