PDA

Показать полную графическую версию : [решено] Копирование файлов бекапов из папок за 1,10,20 число каждого месяца


alevakr
16-11-2017, 18:24
Доброго времени суток.
Есть папка Backup с подпапками, в которых хрняться бекапы разных баз.
Backup
Dakor
Dakor_backup_2017_11_08_001001_3006760.bak
........
Dakor_backup_2017_10_31_001001_3006760.bak
..........
Xakor
Xakor_backup_2017_11_08_001001_3075033.bak
Xakor_backup_2017_11_07_001001_3075033.bak
Нужно из всех подпапок скопировать в папку Decades все файлы за 10 и 20 число каждого месяца. В папку Months копировать файлы за 01 число каждого месяца. В папках Decades и Months подпапок нету.
После этого во всех подпапках папки Backup оставить файлы только за последние 10 дней.

Кусок с удалением файлов за последние 10 дней нашёл.
Придумал как копировать файлы за 20 число, дальше застрял.
for /r D:\BBB\Backup %%i in (*_20_*) do (xcopy /e "%%i" "D:\BBB\Decades")

megaloman
17-11-2017, 01:03
@Echo Off

Call :CopyFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" "Z:\Box_Arc\Months" 01
Call :CopyFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" "Z:\Box_Arc\Decades" 10
Call :CopyFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" "Z:\Box_Arc\Decades" 20

Call :CopyFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" "Z:\Box_Arc\Months" 01
Call :CopyFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" "Z:\Box_Arc\Decades" 10
Call :CopyFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" "Z:\Box_Arc\Decades" 20

Call :DelFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" 10
Call :DelFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" 10

GoTo :Eof

:CopyFile
FOR %%f IN ("%~1") DO (
FOR /F "tokens=5 delims=_" %%d IN ("%%~nxf") DO (
If %3==%%d If Not Exist "%2\%%~nxf" Copy "%%f" "%2\" >nul
)
)
GoTo :Eof

:DelFile
FOR /F "usebackq skip=%2 delims=" %%f IN (`dir "%~1" /b /A:-D /O:-N 2^>nul`) DO Del "%~dp1%%f"
GoTo :Eof Сопируем файлы по указанным маскам за указанные дни в указанное место. Дни выделяем из имени.
Удаляем все файлы по указанной маске, кроме указанного числа самых "свежих". "Свежесть" определяем по имени файла.

alpap
17-11-2017, 02:17
@echo off
set "Backup=D:\Backup"
set "Months=C:\Months"
set "Decades=C:\Decades"
set "c1=01"& set "c10=10"& set "c20=20"
set "exp=bak"
set "dd=10"

pushd "%Backup%"
for /f "tokens=1-5* delims=_" %%a in ('2^>nul dir /a-d/b/s "*.%exp%"') do (
echo %%e|>nul findstr /x /c:"%c1%" && ((if not exist "%Months%" md "%Months%")& >nul copy "%%a_%%b_%%c_%%d_%%e_%%f" "%Months%")
echo %%e|>nul findstr /x /c:"%c10%" /c:"%c20%" && ((if not exist "%Decades%" md "%Decades%")& >nul copy "%%a_%%b_%%c_%%d_%%e_%%f" "%Decades%")
)
for /f "delims=" %%A in ('dir /ad/b') do (
pushd "%%A"
for /f "delims=" %%a in ('dir /a-d/b/o-n "*.%exp%"^|more +%dd%') do del "%%a"
popd
)
popd
pause

megaloman
17-11-2017, 03:23
У alpap подсмотрел вариант, что возможно в папке Backup есть несколько подпапок, не обязательно только 2, указанные в вопросе, в которых имеются бэкапы, имена которых соответствуют приведенным в вопросе правилам. Тогда вот еще вариант:@Echo Off

Set "BoxIn=Z:\Box_In\Backup"
Set "BoxOut=Z:\Box_Arc"

FOR /F "usebackq delims=" %%i IN (`dir "%BoxIn%" /b /A:D 2^>nul`) DO Call :Folders "%BoxIn%" "%%i" "%BoxOut%"

GoTo :Eof

:Folders
Call :CopyFile "%~1\%~2\%~2_backup_20*.bak" "%~3\Months" 01
Call :CopyFile "%~1\%~2\%~2_backup_20*.bak" "%~3\Decades" 10
Call :CopyFile "%~1\%~2\%~2_backup_20*.bak" "%~3\Decades" 20
Call :DelFile "%~1\%~2\%~2_backup_20*.bak" 10
GoTo :Eof

:CopyFile
FOR %%f IN ("%~1") DO (
FOR /F "tokens=5 delims=_" %%d IN ("%%~nxf") DO (
If %3==%%d If Not Exist "%2\%%~nxf" Copy "%%f" "%2\" >nul
)
)
GoTo :Eof

:DelFile
FOR /F "usebackq skip=%2 delims=" %%f IN (`dir "%~1" /b /A:-D /O:-N 2^>nul`) DO Del "%~dp1%%f"
GoTo :EofКроме того, и в этом варианте, и в исправленном предыдущем учтено, что если бэкап уже скопирован, повторно он копироваться не будет.

alevakr
17-11-2017, 10:52
Спасибо. Да, в папке Backup может быть произвольное количество подпапок.




© OSzone.net 2001-2012