![]() |
Скрипт для удаления повторяющихся папок
Добрый день!
Имеется огромное количество мелких папок с файлами. Чтобы файловый сервер вздохнул чуть свободнее хотелось бы его почистить. Пока мой воспаленный мозг выдал максимум: @Echo Off Set FDir="P:\Work\2021\" Set Maska="*comp*v01.*0000*" FOR /R %FDir% %%i IN (%Maska%) DO Call :Obrabotka "%%i" GoTo :EOF :Obrabotka Echo %1 Но это поиск фалов, а не каталогов. Хотелось бы как в примере ниже, но мозгов не хватает. \\srv\Projects\Work\2021\ #отправная точка \Productions\Pinery\Citilink\Campaign_2021_TVC_21.06.17\ #далее агентство, клиент, проект. Как правило это 3-5 уровней вложенности \Graphics\Spots\SP0020\SH0040\Compositions\KorolevA\ #далее структура проекта - графика, ролики, ролик, шот, тип работ, исполнитель. По идее это жесткая структура, но возможны девиации. \PPCCT_210617_SP0020_SH0040_comp_AK_v01\ #далее папки с секвенциями. Если их больше N версий - оставляем N последних [v06, v05, v04] \PPCCT_210617_SP0020_SH0040_comp_AK_v02\ \PPCCT_210617_SP0020_SH0040_comp_AK_v03\ \PPCCT_210617_SP0020_SH0040_comp_AK_v04\ \PPCCT_210617_SP0020_SH0040_comp_AK_v05\ \PPCCT_210617_SP0020_SH0040_comp_AK_v06\ искомый объект должен отвечать этим условиям: - это каталог - путь соответствует маске - имя каталога содержит строку '_comp_' - внутри содержатся .exr файлы действия с найденными объектами: -переход к файлу -удаление объекта |
Цитата:
Код:
\\srv\Projects\Work\2021\Productions\Pinery\Citilink\Campaign_2021_TVC_21.06.17\Graphics\Spots\SP0020\SH0040\Compositions\KorolevA\PPCCT_210617_SP0020_SH0040_comp_AK_v01 Цитата:
Цитата:
Цитата:
|
Вложений: 1
Цитата:
\\srv\Work\2021\BBDO\Lada\SVO_Largus_Niva_OLV_21.08.18\Graphics\Spots\SP0010\SH0010\Compositions\Kul adzhiA\BLSO_210818_SP0010_SH0010_comp_AK_v01\ Цитата:
Цитата:
Цитата:
|
Цитата:
Хорошо, например, имеем каталоги: \PPCCT_210617_SP0020_SH0040_comp_AK_v01\ - содержит .exr \PPCCT_210617_SP0020_SH0040_comp_AK_v02\ - содержит .mov \PPCCT_210617_SP0020_SH0040_comp_AK_v03\ - содержит .mov и .exr \PPCCT_210617_SP0020_SH0040_comp_AK_v04\ - содержит .mov \PPCCT_210617_SP0020_SH0040_comp_AK_v05\ - содержит .exr \PPCCT_210617_SP0020_SH0040_comp_AK_v06\ - содержит .mov и .exr Какие каталоги выбрать? Учитывать то, что в каталоге разные файлы + .exr (тогда получается 3,5,6), или выбирать только те, в которых только .exr (тогда остаётся только 1 и 5)? |
Вложений: 1
Вот так может выглядеть папка в которой нужно удалить помеченные версии.
Смотри скрин. |
Это было понятно с самого начала. Непонятны критерии, по которым надо папки удалять.
Прочтите внимательно, о чём я спрашиваю. |
Цитата:
Цитата:
Я не уверен что такого рода функцию можно сделать в среде win. Возможно мои хотелки скорее относятся к языкам программирования где можно задать много переменных. Идеальная структура на скрине выше. |
Цитата:
Список полных путей каталогов, где есть файлы .exr: Powershell: Код:
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% { |
Цитата:
|
Вложений: 1
Цитата:
|
Выше добавил вывод объёма под каждой папкой в мегабайтах.
|
Цитата:
|
Можно сделать ещё интереснее.
Код:
$report = @() |
Цитата:
Опять же есть много версий одного проекта нужно оставить только три последние в папке или вообще ничего не делать если их три и менее. |
Добавлена колонка родительской папки, затем берутся уникальные значения родительских папок, выбираются каталоги с определённой родительской папкой, сортируются по последним цифрам, из списка убираются 3 последних каталога, остальные удаляются.
Уберите параметр -WhatIf, чтобы удалялось реально. С ним будет только выводиться информация. Код:
$report = @() |
Цитата:
|
Цитата:
Все сработало за исключением 'РазмерМБ'. Беглый просмотр показал успешность кода! |
Размер можно получить, если вывести
Код:
$report |sort 'РазмерМБ' -Descending |fl |
Время: 23:49. |
Время: 23:49.
© OSzone.net 2001-