Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт для удаления повторяющихся папок (http://forum.oszone.net/showthread.php?t=351269)

asaut 24-05-2022 14:52 2985617

Скрипт для удаления повторяющихся папок
 
Добрый день!

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

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

@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 2985628

Цитата:

Цитата asaut
\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\SP0020\SH0040\Compositions\KorolevA\PPCCT_210617_SP0020_SH0040_comp_AK_v01
?

Цитата:

Цитата asaut
Если их больше N версий - оставляем N последних [v06, v05, v04] »

Что значит "оставляем"? Более старые удалить не глядя на содержимое? Или старые игнорировать и чистить эти последние?

Цитата:

Цитата asaut
внутри содержатся .exr файлы »

Только они? А если что-то ещё?

Цитата:

Цитата asaut
действия с найденными объектами:
-переход к файлу
-удаление объекта »

Что значит "переход к файлу"? Если его удаляем, зачем к нему "переходить"?

asaut 24-05-2022 15:31 2985630

Вложений: 1
Цитата:

Цитата DJ Mogarych
Это разные пути внутри основного каталога или это один путь типа »

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

Цитата:

Цитата DJ Mogarych
Что значит "оставляем"? Более старые удалить не глядя на содержимое? Или старые игнорировать и чистить эти последние? »

Там бывает несколько версий, и хотелось бы оставить парочку последних

Цитата:

Цитата DJ Mogarych
Только они? А если что-то ещё? »

Бывает как на скрине. Верхняя папка содержит файлы .mov, а нижняя .exr

Цитата:

Цитата DJ Mogarych
Что значит "переход к файлу"? Если его удаляем, зачем к нему "переходить"? »

Не уверен что это нужно, но подтверждение удаления лучше вставить

DJ Mogarych 24-05-2022 15:47 2985632

Цитата:

Цитата asaut
Там бывает несколько версий, и хотелось бы оставить парочку последних »

Всё равно непонятно - более старые удалить не глядя?

Хорошо, например, имеем каталоги:
\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 2985633

Вложений: 1
Вот так может выглядеть папка в которой нужно удалить помеченные версии.
Смотри скрин.

DJ Mogarych 24-05-2022 16:00 2985636

Это было понятно с самого начала. Непонятны критерии, по которым надо папки удалять.
Прочтите внимательно, о чём я спрашиваю.

asaut 24-05-2022 16:00 2985637

Цитата:

Цитата DJ Mogarych
Всё равно непонятно - более старые удалить не глядя? »

Для начала необходимо видеть список каталогов, а потом принимать решение.

Цитата:

Цитата DJ Mogarych
Какие каталоги выбрать? Учитывать то, что в каталоге разные файлы + .exr (тогда получается 3,5,6), или выбирать только те, в которых только .exr (тогда остаётся только 1 и 5)? »

Необходимые нам каталоги в которых содержится .exr

Я не уверен что такого рода функцию можно сделать в среде win. Возможно мои хотелки скорее относятся к языкам программирования где можно задать много переменных.

Идеальная структура на скрине выше.

DJ Mogarych 24-05-2022 16:11 2985640

Цитата:

Цитата asaut
Возможно мои хотелки скорее относятся к языкам программирования где можно задать много переменных. »

В 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 2985642

Цитата:

Цитата DJ Mogarych
dir "\\srv\Projects\Work\2021" -Recurse -directory |? name -match '_comp_' |% {
if ($_.EnumerateFiles().extension -eq '.exr') {
$_.FullName
}
} »

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

asaut 24-05-2022 16:33 2985646

Вложений: 1
Цитата:

Цитата DJ Mogarych
В Windows это называется Powershell, рекомендую. »

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

DJ Mogarych 24-05-2022 16:34 2985647

Выше добавил вывод объёма под каждой папкой в мегабайтах.

asaut 24-05-2022 17:00 2985653

Цитата:

Цитата DJ Mogarych
Выше добавил вывод объёма под каждой папкой в мегабайтах. »

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

DJ Mogarych 24-05-2022 17:33 2985656

Можно сделать ещё интереснее.

Код:

$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 2985659

Цитата:

Цитата DJ Mogarych
Можно сделать ещё интереснее. »

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

DJ Mogarych 24-05-2022 21:27 2985675

Добавлена колонка родительской папки, затем берутся уникальные значения родительских папок, выбираются каталоги с определённой родительской папкой, сортируются по последним цифрам, из списка убираются 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 2985699

Цитата:

Цитата DJ Mogarych
Добавлена колонка родительской папки, затем берутся уникальные значения родительских папок, выбираются каталоги с определённой родительской папкой, сортируются по последним цифрам, из списка убираются 3 последних каталога, остальные удаляются.
Уберите параметр -WhatIf, чтобы удалялось реально. С ним будет только выводиться информация. »

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

asaut 25-05-2022 12:54 2985705

Цитата:

Цитата DJ Mogarych
$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 2985709

Размер можно получить, если вывести
Код:

$report |sort 'РазмерМБ' -Descending |fl
Если использовать скрипт только для удаления лишних каталогов, то размер там не используется и строку 'РазмерМБ' внутри $obj можно закомментировать.


Время: 23:49.

Время: 23:49.
© OSzone.net 2001-