Войти

Показать полную графическую версию : [решено] чистка папки по заданной маске


blacks2
29-10-2020, 09:17
Здравствуйте.
Прошу помощи.


Скрипт бекапера
В папке e:\backup_dir создаются папки
\20170101_11_53_name_year\ - беки создаются раз в 1-12 месяцев
\20201205_10_23_name_small\ - беки создаются каждый день
...
внутри файлы, с одинаковыми названиями


После создания, проводится чистка старых файлов и папок.
Соответственно, чистка "forfiles за Х дней" - чистится всё:
И годовой бекап теряется при создании каждодневного...



ВЫВОД:
Нужна чистка папки по заданной маске (например *_year )




Вариант А.
- плох: полюбому чистятся все каждодневные и годовые файлы...
- а сделать: работа по маскам директорий, из которых будут удаляться старые файлы, а после и сами папки...
- не имею представления как! :sorry:
@ECHO OFF
chcp 866

SET BKUP_DelPath=е:\backup_dir
SET BKUP_DelLogs=е:\backup_dir\Deleted.log
SET BKUP_Max_Days=7

forfiles /p "%BKUP_DelPath%" /s /m * /D -%BKUP_Max_Days% /C "cmd /c del /q /s @path" >> %BKUP_DelLogs%
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BKUP_DelPath%" /S /B /A:D ^|Sort /R`) DO 2>nul Rd "%%d"&&>>"%BKUP_DelLogs%" Echo "%%d"

echo pause and end
PAUSE >nul



Вариант B.
Решение находит папки по маске и чистить в них файлы +сами папки по маске
(рабочее: хоть и пишет "ОШИБКА: не удается найти указанный файл")

@ECHO OFF
chcp 866

SET BKUP_DelPath=е:\backup_dir
SET BKUP_DelLogs=е:\backup_dir\Deleted.log
SET BKUP_Max_Days=7

forfiles /S /P "%BKUP_DelPath%" /M *_base /D -%BKUP_Max_Days% /C "cmd /C if @isdir == TRUE (rd /S /Q @path) else (del /F /A @path)" >> "%BKUP_DelLogs%"

echo pause and end
PAUSE >nul


Однако,
Сколько методом тыка(знаний не хватает) не пытался сделать вывод в лог - не получалось
Хотя пример и найден на просторах буржунета, и вроде у них работает... - но у меня нет.



Очень прошу помощи:
а. с правкой варианта #А. - под задачу работы с масками
или
б. с вариантом #В. - настроить вывод в лог (если такое возможно)


ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО!



PS
простым решением было бы создание субпапок
e:\backup_dir\_year\
e:\backup_dir\_smal\

но вроде как моё ядро бекапера порушится/переписывать
а главное, когда все папки с датами в одной месте - то наглядно, всё видно, оценка, анализ...

megaloman
29-10-2020, 16:14
blacks2, Давайте не будем мыслить линейно и привязываться к датам. Допустим, надо хранить 3 последних годовых бэкапа и 7 ежедневных. Зачем возиться с файлами, когда у Вас порядок с именованием папок, будем выводить имена папок по имени в соответствии с маской в обратном порядке и удалим все папки, кроме указанного количества последних.@Echo Off
Call :DelOld "Z:\Box_Arc" "*_11_53_тра ля ля_ку_ку_year" 3 "e:\Deleted.log"
Call :DelOld "Z:\Box_Arc" "*_11_53_тра ля ля_ку_ку_small" 7 "e:\Deleted.log"
Exit /B

:DelOld
FOR /F "usebackq skip=%3 delims=" %%d IN (`2^>nul Dir "%~1\%~2" /B /A:D /O:-N`) DO 2>nul Rd /S /Q "%~1\%%d" &&>>%4 Echo "%~1\%%d"
Exit /B
В аргументах:
"Имя папки с подпапками бэкапов" "маска подпапок с файлами бэкапов" "количество хранимых подпапок по маске" "путь к файлу лога"

blacks2
30-10-2020, 16:12
Давайте не будем мыслить линейно и привязываться к датам. Допустим, надо хранить 3 последних годовых бэкапа и 7 ежедневных. Зачем возиться с файлами, когда у Вас порядок с именованием папок, будем выводить имена папок по имени в соответствии с маской в обратном порядке и удалим все папки, кроме указанного количества последних. »


"А что, так можно было!?" v.2.0
=)


Работает!!
Благадарю!



Вопрос:
можно ли чем-то заменить строки с Exit /B ?

Поясню:
После приведенного Вами (еще раз спасибо!) скрипта
следом должен запускаться скрипт конвертации кодировки (#A)
и 2 комманды по запуску exeшника (#B)
но они не срабатывают именно из-за Exit /B

Пробовал удалять, заменять на Goto, убирать /b, удалять то одну строку то другую с Exit /B
- не помогло.

Спасибо!


for %%? in ("") do chcp 1251 & cmd /d /a /c set /p=яю<NUL > .tmp
chcp 866
cmd /d /u /c type "%BKUP_11_logX%" >> .tmp
chcp 1251
cmd /d /a /c type .tmp > "%BKUP_11_logX%"
del .tmp
MSG.EXE "COMPLETED\n\nStart %run%\nFinsh %time%"
start notepad "%logX%"

megaloman
30-10-2020, 16:18
blacks2, дописывайте код не после exit, а перед ним в верхней части скрипта.
А в вверхней части скрипта можете eще добавлять call для других путей, масок, лог-файлов

blacks2
05-11-2020, 20:47
дописывайте код не после exit, а перед ним в верхней части скрипта.
А в вверхней части скрипта можете eще добавлять call для других путей, масок, лог-файлов »

Благодарствую!
Работает!




© OSzone.net 2001-2012