BATCH 创建新文件时删除最旧的备份文件
BATCH Delete oldest backup file when creating a new one
我有一个关于在文件夹获得 X 数量的具有相同扩展名的文件后删除最旧文件的问题,在这种情况下,所有文件共享扩展名 *.bak
,它们是小文件我为我的 firefox RES 创建的,他们已经在标题、创建日期和时间上留下了印记,这是我能做到的。
无论如何,我偶然发现了这个:。我正在努力让它实现我的想法。
问题是我希望批处理在使用这行简单的代码创建新文件后简单地检查哪个文件是最旧的。
copy /y store.json "%DROPBOX%\RES BACKUPS\store.json %date:~-4,4%-%date:~-7,2%-%date:~-10,2%_%time:~0,2%hs-%time:~3,2%min-%time:~6,2%s.bak"
你可以使用这个:
@echo off
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%DROPBOX%\RES BACKUPS\*.bak"') do (
del "%%a"
goto :breakLoop
)
:breakLoop
我建议先用 echo del "%%a"
测试它以确保它删除了正确的文件。
这通过获取 dir 命令的输出来工作,该命令以裸格式显示所有文件(仅文件名,而不是大小等),首先按最旧的文件排序。然后删除找到的第一个文件,并中断循环。
超过一定数量就不断删除文件的版本:
@echo off
set "source=%DROPBOX%\RES BACKUPS\*.bak"
set "minFiles=5"
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof
:loop
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%source%"') do (
del "%%a"
goto :breakLoop
)
:breakLoop
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop
pause
您可以通过删除行 for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop
使其成为非循环(但仍然只在超过 5 个时才删除)
我有一个关于在文件夹获得 X 数量的具有相同扩展名的文件后删除最旧文件的问题,在这种情况下,所有文件共享扩展名 *.bak
,它们是小文件我为我的 firefox RES 创建的,他们已经在标题、创建日期和时间上留下了印记,这是我能做到的。
无论如何,我偶然发现了这个:
问题是我希望批处理在使用这行简单的代码创建新文件后简单地检查哪个文件是最旧的。
copy /y store.json "%DROPBOX%\RES BACKUPS\store.json %date:~-4,4%-%date:~-7,2%-%date:~-10,2%_%time:~0,2%hs-%time:~3,2%min-%time:~6,2%s.bak"
你可以使用这个:
@echo off
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%DROPBOX%\RES BACKUPS\*.bak"') do (
del "%%a"
goto :breakLoop
)
:breakLoop
我建议先用 echo del "%%a"
测试它以确保它删除了正确的文件。
这通过获取 dir 命令的输出来工作,该命令以裸格式显示所有文件(仅文件名,而不是大小等),首先按最旧的文件排序。然后删除找到的第一个文件,并中断循环。
超过一定数量就不断删除文件的版本:
@echo off
set "source=%DROPBOX%\RES BACKUPS\*.bak"
set "minFiles=5"
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A leq %minFiles% goto :eof
:loop
for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "%source%"') do (
del "%%a"
goto :breakLoop
)
:breakLoop
for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop
pause
您可以通过删除行 for /f %%A in ('dir "%source%" /a-d-s-h /b ^| find /v /c ""') do if %%A gtr %minFiles% goto :loop