Rsync+cwRsync部署BBS文件双机备份手记介绍的备份方案会有一个问题,比如,我的数据库备份希望保留有限的几个副本,因而不在rsync中加入--delete选项,那么就面临这mysql备份无限制增长的难题,那么,这个批处理就非常有用
当文件个数大于N个后,删除目录中比最新文件的修改日期旧M天以上的文件(Win2003+批处理)
[text]
@echo off&setlocal enabledelayedexpansion
echo By ihipop.gicp.net
echo 进入目录E:\bbsup\mysql
cd E:\bbsup\mysql
echo 计算文件个数
for /f "delims=" %%i in ('dir /a-d /b') do (
set /a a+=1
)
if !a! GEQ 4 goto clean-backup
exit
:clean-backup
echo 获取当前目录最新文件的文件名
echo 对dir进行按日期排序,取第一个结果
for /f "delims=" %%a in ('dir/a/b/o-d') do set a=%%a&goto a
:a
echo 取得最新文件的日期
forfiles /M "%a%" /C "cmd /c echo @fdate>E:\b"
for /f %%i in (E:\b) do set c=%%i
del /q E:\b
ping -n 5 127.1 >nul
rem ————————
rem 转化日期开始
rem ————————
set day=%c%
set days=0
set input=1
:: 提取日期
for /f "tokens=1-3 delims=-/. " %%i in ("%day%") do (
set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100
)
:: 把年份转化为天数
for /l %%i in (1,1,%sy%) do (
set /a leap="^!(%%i %% 4) & ^!(^!(%%i %% 100)) | ^!(%%i %% 400)"
set /a days=days+365+leap
)
:: 把月份转化为天数
set /a num=0, mday=0, max=28+leap
set str=0 31 %max% 31 30 31 30 31 31 30 31 30
for %%i in (%str%) do (
set /a num+=1
if !num! leq !sm! set /a mday+=%%i
)
set /a days=days+mday+sd
set /a days-=input
rem ========把天数转换为日期========
:: 获取年份
for /l %%i in (1,1,%sy%) do (
set /a leap="^!(%%i %% 4) & ^!(^!(%%i %% 100)) | ^!(%%i %% 400)"
set /a days_tmp=365+leap
if !days! gtr !days_tmp! (
set /a days-=days_tmp
set y=%%i
)
)
:: 获取月份及日期
set /a m=1, max=28+%leap%
set str=31 %max% 31 30 31 30 31 31 30 31 30
for %%i in (%str%) do (
if !days! gtr %%i (
set /a days-=%%i
set /a m+=1
) else goto next
)
:next
set m=0%m%
set d=0%days%
cls
echo.&echo.
echo 指定的日期是:%day%
echo.
echo %input%天前的日期是:%y%-%m:~-2%-%d:~-2%
rem ————————
rem 转化日期结束
rem ————————
echo 删除%input%天前的文件(%y%-%m:~-2%-%d:~-2%)
forfiles /D -%y%-%m:~-2%-%d:~-2% /C "cmd /c del /q @file
ping -n 20 127.1 >nul
[/text]