Войти

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


asaut
24-05-2022, 14:52
Добрый день!

Имеется огромное количество мелких папок с файлами. Чтобы файловый сервер вздохнул чуть свободнее хотелось бы его почистить.

Пока мой воспаленный мозг выдал максимум:

@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 файлы »
Только они? А если что-то ещё?

действия с найденными объектами:
-переход к файлу
-удаление объекта »
Что значит "переход к файлу"? Если его удаляем, зачем к нему "переходить"?

asaut
24-05-2022, 15:31
Это разные пути внутри основного каталога или это один путь типа »

Один из путей:
\\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)?

asaut
24-05-2022, 15:53
Вот так может выглядеть папка в которой нужно удалить помеченные версии.
Смотри скрин.

DJ Mogarych
24-05-2022, 16:00
Это было понятно с самого начала. Непонятны критерии, по которым надо папки удалять.
Прочтите внимательно, о чём я спрашиваю.

asaut
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
""
}
}

asaut
24-05-2022, 16:24
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if ($_.EnumerateFiles().extension -eq '.exr') {
$_.FullName
}
} »

Интересно, а объем каждой папки возможно узнать?

asaut
24-05-2022, 16:33
В Windows это называется Powershell, рекомендую. »

Вообще меня даже это продвинуло очень далеко. Прекрасная структура.

DJ Mogarych
24-05-2022, 16:34
Выше добавил вывод объёма под каждой папкой в мегабайтах.

asaut
24-05-2022, 17:00
Выше добавил вывод объёма под каждой папкой в мегабайтах. »

Спасибо! *с пеной у рта*

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

asaut
24-05-2022, 18:09
Можно сделать ещё интереснее. »

Уже создал табличку и посчитал место занимаемое этим безобразием. Теперь ищу формулу как убрать ненужные версии.
Опять же есть много версий одного проекта нужно оставить только три последние в папке или вообще ничего не делать если их три и менее.

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
}
}

asaut
25-05-2022, 11:56
Добавлена колонка родительской папки, затем берутся уникальные значения родительских папок, выбираются каталоги с определённой родительской папкой, сортируются по последним цифрам, из списка убираются 3 последних каталога, остальные удаляются.
Уберите параметр -WhatIf, чтобы удалялось реально. С ним будет только выводиться информация. »

Спасибо, тестирую. Это займет какое-то время тк в прошлый раз я нашел пять тысяч папок. Напишу как прошло

asaut
25-05-2022, 12:54
$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