本指南采用通用工具:Linux用rsync+tar,Windows用robocopy+7-Zip,所有工具无需额外付费,默认或一键安装可用。
脚本功能:每周日做一次完整备份(压缩),周一到周六做rsync增量同步(不压缩,保留文件树,便于快速恢复),保留最近4次完整备份和对应增量快照,自动删除过期文件。
创建脚本文件/opt/backup_to_local.sh,权限设为700
```bash !/bin/bash 定义变量 BACKUP_SRC="/var/www /etc /home" 改成你要备份的目录,空格分隔 BACKUP_DEST="/mnt/backup_local" FULL_BAK_TAG="full_$(date +%Y%m%d)" INCR_BAK_TAG="incr_$(date +%Y%m%d)" LAST_FULL_BAK=$(ls -d $BACKUP_DEST/full_ 2>/dev/null | tail -n 1) 检查挂载点 if ! mountpoint -q $BACKUP_DEST; then echo "备份挂载点未挂载,退出!" >> /var/log/backup_local.log exit 1 fi 创建日志目录 mkdir -p $(dirname /var/log/backup_local.log) 执行备份 if [ $(date +%u) -eq 7 ]; then 周日做完整备份 压缩完整备份 tar -zcvpf $BACKUP_DEST/$FULL_BAK_TAG.tar.gz --exclude-from=/opt/backup_exclude.txt $BACKUP_SRC >> /var/log/backup_local.log 2>&1 同步文件树作为增量备份的基准 rsync -avz --delete --exclude-from=/opt/backup_exclude.txt $BACKUP_SRC $BACKUP_DEST/$FULL_BAK_TAG/ >> /var/log/backup_local.log 2>&1 删除第5次及更早的完整备份和对应基准 OLD_BAK_COUNT=$(ls -d $BACKUP_DEST/full_.tar.gz 2>/dev/null | wc -l) if [ $OLD_BAK_COUNT -gt 4 ]; then ls -d $BACKUP_DEST/full_.tar.gz $BACKUP_DEST/full_/ 2>/dev/null | head -n $(( (OLD_BAK_COUNT -4)2 )) | xargs rm -rf >> /var/log/backup_local.log 2>&1 fi else 非周日做增量同步 if [ -z "$LAST_FULL_BAK" ]; then echo "没有找到最近的完整备份基准,退出!" >> /var/log/backup_local.log exit 1 fi rsync -avz --delete --exclude-from=/opt/backup_exclude.txt --link-dest=$LAST_FULL_BAK/ $BACKUP_SRC $BACKUP_DEST/$INCR_BAK_TAG/ >> /var/log/backup_local.log 2>&1 只保留和最近4次完整备份对应的增量快照 for BAK_DIR in $BACKUP_DEST/incr_/; do BAK_DATE=$(echo $BAK_DIR | grep -oE 'incr_[0-9]{8}' | cut -d'_' -f2) if ! ls $BACKUP_DEST/full_.tar.gz | grep -q $(date -d "$BAK_DATE -$(($(date -d $BAK_DATE +%u)-7)) days" +%Y%m%d); then rm -rf $BAK_DIR >> /var/log/backup_local.log 2>&1 fi done fi echo "备份完成!$(date)" >> /var/log/backup_local.log ```
创建/opt/backup_exclude.txt,添加不需要备份的内容
``` .log .tmp .swp /var/cache /var/tmp /proc /sys /dev /run /mnt /media /lost+found ```执行crontab -e添加定时任务(假设每天凌晨2点执行)
``` 0 2 /opt/backup_to_local.sh ```脚本功能:和Linux逻辑一致,每周日完整备份(7-Zip压缩),周一到周六robocopy镜像增量同步,保留最近4次完整备份和对应基准,自动删除过期文件。
创建脚本文件C:\Scripts\backup_to_local.bat,右键属性-安全-编辑-仅保留管理员和SYSTEM的完全控制权限
```batch @echo off setlocal enabledelayedexpansion :: 定义变量 set BACKUP_SRC=C:\inetpub C:\Users\Administrator\Documents C:\Windows\System32\drivers\etc :: 改成你要备份的目录,空格分隔 set BACKUP_DEST=Z: set FULL_BAK_TAG=full_%date:~0,4%%date:~5,2%%date:~8,2% set INCR_BAK_TAG=incr_%date:~0,4%%date:~5,2%%date:~8,2% set SEVENZIP="C:\Program Files\7-Zip\7z.exe" :: 检查7-Zip if not exist %SEVENZIP% ( echo 7-Zip未安装或路径错误,退出! >> C:\Scripts\backup_local.log exit /b 1 ) :: 检查备份目标 if not exist %BACKUP_DEST%\ ( echo 备份目标不存在,退出! >> C:\Scripts\backup_local.log exit /b 1 ) :: 获取周几(周日=0,周一=1...周六=6) for /f "tokens=2 delims==" %%a in ('wmic path win32_localtime get dayofweek /format:list') do set DAYOFWEEK=%%a :: 获取最近的完整备份基准 set LAST_FULL_BAK= for /f "delims=" %%d in ('dir /b /ad /o-d %BACKUP_DEST%\full_ 2^>nul') do ( set LAST_FULL_BAK=%BACKUP_DEST%\%%d goto :found_last_full ) :found_last_full :: 执行备份 if %DAYOFWEEK% equ 0 ( :: 完整压缩备份 %SEVENZIP% a -t7z -mx=9 -mmt=on -xr!.log -xr!.tmp -xr!.temp -xr!C:\inetpub\logs -xr!C:\Windows\Temp -xr!C:\Users\\AppData\Local\Temp %BACKUP_DEST%\%FULL_BAK_TAG%.7z %BACKUP_SRC% >> C:\Scripts\backup_local.log 2>&1 :: 同步文件树作为基准 robocopy "%BACKUP_SRC%" "%BACKUP_DEST%\%FULL_BAK_TAG%" /MIR /XD "C:\inetpub\logs" "C:\Windows\Temp" "C:\Users\\AppData\Local\Temp" /XF ".log" ".tmp" ".temp" /R:3 /W:1 >> C:\Scripts\backup_local.log 2>&1 :: 删除第5次及更早的完整备份和基准 set FULL_COUNT=0 for /f "delims=" %%f in ('dir /b /a-d /o-d %BACKUP_DEST%\full_.7z 2^>nul') do set /a FULL_COUNT+=1 if !FULL_COUNT! gtr 4 ( set /a DELETE_COUNT=(!FULL_COUNT!-4)2 for /f "delims=" %%d in ('dir /b /a-d /ad /o-d %BACKUP_DEST%\full_ 2^>nul') do ( if !DELETE_COUNT! gtr 0 ( rd /s /q "%BACKUP_DEST%\%%d" 2>nul del /f /q "%BACKUP_DEST%\%%d.7z" 2>nul set /a DELETE_COUNT-=1 ) else ( goto :delete_done ) ) ) :delete_done ) else ( :: 检查基准 if "%LAST_FULL_BAK%" equ "" ( echo 没有找到最近的完整备份基准,退出! >> C:\Scripts\backup_local.log exit /b 1 ) :: 镜像增量同步(利用robocopy的/MIR快速实现) robocopy "%BACKUP_SRC%" "%BACKUP_DEST%\%INCR_BAK_TAG%" /MIR /XD "C:\inetpub\logs" "C:\Windows\Temp" "C:\Users\\AppData\Local\Temp" /XF ".log" ".tmp" ".temp" /R:3 /W:1 >> C:\Scripts\backup_local.log 2>&1 :: 仅保留对应完整备份周期内的增量 for /f "delims=" %%i in ('dir /b /ad /o-d %BACKUP_DEST%\incr_ 2^>nul') do ( set INCR_DATE=%%i set INCR_DATE=!INCR_DATE:~5,8! :: 计算该增量对应的完整备份日期 set /a INCR_WEEK=!INCR_DATE:~6,2!-1 set /a INCR_DAY=!INCR_DATE:~8,2!-!DAYOFWEEK! if !INCR_DAY! lss 1 ( set /a INCR_MONTH=!INCR_DATE:~4,2!-1 if !INCR_MONTH! lss 1 ( set /a INCR_YEAR=!INCR_DATE:~0,4!-1 set INCR_MONTH=12 ) else ( set INCR_YEAR=!INCR_DATE:~0,4! ) :: 获取上月天数 for /f "tokens=2 delims==" %%m in ('wmic path win32_localtime get dayofweek /format:list ^| findstr /v "="') do set DUMMY=%%m for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do ( set /a MONTH_COUNT+=1 if !MONTH_COUNT! equ !INCR_MONTH! set LAST_MONTH_DAYS=%%m ) :: 闰年判断 set /a LEAP=!INCR_YEAR! %% 4 set /a LEAP100=!INCR_YEAR! %% 100 set /a LEAP400=!INCR_YEAR! %% 400 if !INCR_MONTH! equ 2 ( if !LEAP! equ 0 ( if !LEAP100! neq 0 ( set LAST_MONTH_DAYS=29 ) else if !LEAP400! equ 0 ( set LAST_MONTH_DAYS=29 ) ) ) set /a INCR_DAY+=!LAST_MONTH_DAYS! ) else ( set INCR_YEAR=!INCR_DATE:~0,4! set INCR_MONTH=!INCR_DATE:~4,2! ) :: 补零 if !INCR_MONTH! lss 10 set INCR_MONTH=0!INCR_MONTH! if !INCR_DAY! lss 10 set INCR_DAY=0!INCR_DAY! set CORRESPONDING_FULL=full_!INCR_YEAR!!INCR_MONTH!!INCR_DAY! if not exist "%BACKUP_DEST%\!CORRESPONDING_FULL!\" ( rd /s /q "%BACKUP_DEST%\%%i" 2>nul ) ) ) echo 备份完成!%date% %time% >> C:\Scripts\backup_local.log endlocal ```易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图