我有一个目录,我将 MySQL 数据库备份到具有当前日期的文件夹中。
现在,30 或 60 天后,我喜欢只保留该备份目录中的 n 个最新文件夹,并删除其余文件夹,每个文件夹中都有 gzip 压缩的数据库。
为了备份我使用的 MySQL 数据库adityasatrio的批处理脚本 https://gist.github.com/adityasatrio/507585a9c66d7f08fe09并且使用当前日期创建文件夹也已排序感谢这个答案 https://stackoverflow.com/questions/31787056/windows-batch-file-to-backup-local-mysql-databases-only-keep-n-latest-folders.
然而,就本示例而言,仅保留最新的 3 个文件夹并删除备份目录中的所有其他文件夹似乎很困难。
这是我尝试过的。
:: deletes all files and folders in the backupDir
:: for /f "skip=3 delims=" %%a in ('dir "%backupDir%\" /b /o-d') do echo del "%backupDir%\%%a"
:: deletes only files in backupDir
:: for /f "skip=3 delims=" %%a in ('dir "%backupDir%\" /b /a-d') do echo del "%backupDir%\%%a"
:: deletes all files and folders BUT keeps 3 latest FOLDERS in backupDir
:: for /f "skip=3 delims=" %%a in ('dir "%backupDir%\" /b') do echo del "%backupDir%\%%a"
:: deletes all files and folders BUT keeps 3 latest FOLDERS in backupDir
:: for /f "skip=3 delims=" %%a in (' dir "%backupDir%\" /o-d /b') do echo rd /S /Q "%backupDir%\%%a"
请注意,我不想删除该 backupDir 中可能存在的任何文件。我删除了 backupDir 中除最新 3 个文件夹之外的所有文件夹,因此基本上删除了其中包含 gzipped .sql 文件的旧文件夹。
这些问题有所帮助,但我仍然没有做得正确。
删除除 X 个最近的文件夹之外的所有文件夹 https://stackoverflow.com/questions/18553694/delete-all-but-x-most-recent-folders
如何从目录中删除旧文件,同时在 Windows 上保留最新文件 https://stackoverflow.com/questions/50902/how-do-i-delete-old-files-from-a-directory-while-keeping-the-most-recent-ones-on(文件而不是文件夹)
批处理文件删除超过N天的文件 https://stackoverflow.com/questions/51054/batch-file-to-delete-files-older-than-n-days(再次强调,文件不是文件夹)
https://serverfault.com/questions/49614/delete-files-older-than-x-days https://serverfault.com/questions/49614/delete-files-older-than-x-days(为了更好地衡量,再次强调文件而不是文件夹..)
这条评论删除除 X 个最近的文件夹之外的所有文件夹 https://stackoverflow.com/questions/18553694/delete-all-but-x-most-recent-folders#comment46957275_18554479最接近我想要做的事情,但这也会删除 backupDir 中可能存在的任何文件。
**编辑1:**刚刚发现删除 Windows 中除 2 个最新文件夹之外的所有文件夹 https://stackoverflow.com/questions/17521372/delete-all-folders-except-2-lastest-folders-in-windows并会看看这是否有任何帮助。
下面是我微薄之力的完整脚本popd
在这儿。我希望在您的帮助或意见下解决这个问题以供进一步阅读。注意我对批处理脚本完全陌生。非常感谢对此的任何帮助。请帮我删除除这 N 个最新文件夹之外的所有文件夹。 :)
@echo off
set dbUser=root
set dbPassword=root
set "backupDir=D:\MySQLDumps"
set "mysqldump=C:\wamp\bin\mysql\mysql5.6.17\bin\mysqldump.exe"
set "mysqlDataDir=C:\wamp\bin\mysql\mysql5.6.17\data"
set "zip=C:\Program Files\7-Zip\7z.exe"
rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher.
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"
set "dirname=%YYYY%-%MM%-%DD% %HH%-%Min%-%Sec%"
echo "dirName"="%dirName%"
:: pause
:: switch to the "data" folder
pushd "%mysqlDataDir%"
:: create backup folder if it doesn't exist
if not exist "%backupDir%\%dirName%\" mkdir "%backupDir%\%dirName%"
:: iterate over the folder structure in the "data" folder to get the databases
for /d %%f in (*) do (
echo processing folder "%%f"
"%mysqldump%" --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > "%backupDir%\%dirName%\%%~nxf.sql"
"%zip%" a -tgzip "%backupDir%\%dirName%\%%~nxf.sql.gz" "%backupDir%\%dirName%\%%~nxf.sql"
del "%backupDir%\%dirName%\%%~nxf.sql"
)
popd
:: delete all folders but the latest 3
:: deletes all files and folders in the backupDir
:: for /f "skip=3 delims=" %%a in ('dir "%backupDir%\" /b /o-d') do echo del "%backupDir%\%%a"
:: deletes only files in backupDir
:: for /f "skip=3 delims=" %%a in ('dir "%backupDir%\" /b /a-d') do echo del "%backupDir%\%%a"
:: deletes all files and folders BUT keeps 3 latest FOLDERS in backupDir
:: for /f "skip=3 delims=" %%a in ('dir "%backupDir%\" /b') do echo del "%backupDir%\%%a"
:: deletes all files and folders BUT keeps 3 latest FOLDERS in backupDir
:: for /f "skip=3 delims=" %%a in (' dir "%backupDir%\" /o-d /b') do echo rd /S /Q "%backupDir%\%%a"
pause