Показать полную графическую версию : [решено] Скрипт для удаления повторяющихся папок
Добрый день!
Имеется огромное количество мелких папок с файлами. Чтобы файловый сервер вздохнул чуть свободнее хотелось бы его почистить.
Пока мой воспаленный мозг выдал максимум:
@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 файлы
действия с найденными объектами:
-переход к файлу
-удаление объекта
DJ Mogarych
24-05-2022, 15:22
\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] »
Это разные пути внутри основного каталога или это один путь типа
\\srv\Projects\Work\2021\Productions\Pinery\Citilink\Campaign_2021_TVC_21.06.17\Graphics\Spots\SP002 0\SH0040\Compositions\KorolevA\PPCCT_210617_SP0020_SH0040_comp_AK_v01
?
Если их больше N версий - оставляем N последних [v06, v05, v04] »
Что значит "оставляем"? Более старые удалить не глядя на содержимое? Или старые игнорировать и чистить эти последние?
внутри содержатся .exr файлы »
Только они? А если что-то ещё?
действия с найденными объектами:
-переход к файлу
-удаление объекта »
Что значит "переход к файлу"? Если его удаляем, зачем к нему "переходить"?
Это разные пути внутри основного каталога или это один путь типа »
Один из путей:
\\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\
Что значит "оставляем"? Более старые удалить не глядя на содержимое? Или старые игнорировать и чистить эти последние? »
Там бывает несколько версий, и хотелось бы оставить парочку последних
Только они? А если что-то ещё? »
Бывает как на скрине. Верхняя папка содержит файлы .mov, а нижняя .exr
Что значит "переход к файлу"? Если его удаляем, зачем к нему "переходить"? »
Не уверен что это нужно, но подтверждение удаления лучше вставить
DJ Mogarych
24-05-2022, 15:47
Там бывает несколько версий, и хотелось бы оставить парочку последних »
Всё равно непонятно - более старые удалить не глядя?
Хорошо, например, имеем каталоги:
\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)?
Вот так может выглядеть папка в которой нужно удалить помеченные версии.
Смотри скрин.
DJ Mogarych
24-05-2022, 16:00
Это было понятно с самого начала. Непонятны критерии, по которым надо папки удалять.
Прочтите внимательно, о чём я спрашиваю.
Всё равно непонятно - более старые удалить не глядя? »
Для начала необходимо видеть список каталогов, а потом принимать решение.
Какие каталоги выбрать? Учитывать то, что в каталоге разные файлы + .exr (тогда получается 3,5,6), или выбирать только те, в которых только .exr (тогда остаётся только 1 и 5)? »
Необходимые нам каталоги в которых содержится .exr
Я не уверен что такого рода функцию можно сделать в среде win. Возможно мои хотелки скорее относятся к языкам программирования где можно задать много переменных.
Идеальная структура на скрине выше.
DJ Mogarych
24-05-2022, 16:11
Возможно мои хотелки скорее относятся к языкам программирования где можно задать много переменных. »
В Windows это называется Powershell, рекомендую.
Список полных путей каталогов, где есть файлы .exr:
Powershell:
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if ($_.EnumerateFiles().extension -eq '.exr') {
$_.FullName
($_.EnumerateFiles().length |measure -Sum).sum / 1mb
""
}
}
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if ($_.EnumerateFiles().extension -eq '.exr') {
$_.FullName
}
} »
Интересно, а объем каждой папки возможно узнать?
В Windows это называется Powershell, рекомендую. »
Вообще меня даже это продвинуло очень далеко. Прекрасная структура.
DJ Mogarych
24-05-2022, 16:34
Выше добавил вывод объёма под каждой папкой в мегабайтах.
Выше добавил вывод объёма под каждой папкой в мегабайтах. »
Спасибо! *с пеной у рта*
DJ Mogarych
24-05-2022, 17:33
Можно сделать ещё интереснее.
$report = @()
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if (($enum = $_.EnumerateFiles()).extension -eq '.exr') {
$obj = [pscustomobject]@{
'Каталог' = $_.fullname
'РазмерМБ' = ($enum.length |measure -Sum).sum / 1mb
}
$report += $obj
}
}
# Сортировать вывод по колонке размера, начиная с самого большого значения
$report |sort 'РазмерМБ' -Descending |fl
Можно сделать ещё интереснее. »
Уже создал табличку и посчитал место занимаемое этим безобразием. Теперь ищу формулу как убрать ненужные версии.
Опять же есть много версий одного проекта нужно оставить только три последние в папке или вообще ничего не делать если их три и менее.
DJ Mogarych
24-05-2022, 21:27
Добавлена колонка родительской папки, затем берутся уникальные значения родительских папок, выбираются каталоги с определённой родительской папкой, сортируются по последним цифрам, из списка убираются 3 последних каталога, остальные удаляются.
Уберите параметр -WhatIf, чтобы удалялось реально. С ним будет только выводиться информация.
$report = @()
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if (($enum = $_.EnumerateFiles()).extension -eq '.exr') {
$obj = [pscustomobject]@{
'Каталог' = $_.fullname
'РазмерМБ' = ($enum.length |measure -Sum).sum / 1mb
'Родитель' = $_.Parent.FullName
}
$report += $obj
}
}
foreach ($parent in ($report.'Родитель' |sort -Unique)) {
$toDel = $report |? 'Родитель' -eq $parent |sort {$_.Каталог -replace '(\d+)$','$1'} |select -SkipLast 3
if ($toDel) {
$toDel.каталог |del -Recurse -WhatIf
}
}
Добавлена колонка родительской папки, затем берутся уникальные значения родительских папок, выбираются каталоги с определённой родительской папкой, сортируются по последним цифрам, из списка убираются 3 последних каталога, остальные удаляются.
Уберите параметр -WhatIf, чтобы удалялось реально. С ним будет только выводиться информация. »
Спасибо, тестирую. Это займет какое-то время тк в прошлый раз я нашел пять тысяч папок. Напишу как прошло
$report = @()
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if (($enum = $_.EnumerateFiles()).extension -eq '.exr') {
$obj = [pscustomobject]@{
'Каталог' = $_.fullname
'РазмерМБ' = ($enum.length |measure -Sum).sum / 1mb
'Родитель' = $_.Parent.FullName
}
$report += $obj
}
}
foreach ($parent in ($report.'Родитель' |sort -Unique)) {
$toDel = $report |? 'Родитель' -eq $parent |sort {$_.Каталог -replace '(\d+)$','$1'} |select -SkipLast 3
if ($toDel) {
$toDel.каталог |del -Recurse -WhatIf
}
} »
Все сработало за исключением 'РазмерМБ'. Беглый просмотр показал успешность кода!
DJ Mogarych
25-05-2022, 13:09
Размер можно получить, если вывести
$report |sort 'РазмерМБ' -Descending |fl
Если использовать скрипт только для удаления лишних каталогов, то размер там не используется и строку 'РазмерМБ' внутри $obj можно закомментировать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.