Войти

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


xxx_RedDevil_xxx
25-01-2022, 20:03
Добрый день Товарищи!

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

Есть главная директория, в которой содержаться папки соответствующие названию серверов, в этих папках содержаться папки с названиями БД для каждого сервера и уже в каждой папке с БД содержаться zip файлы имена которых соответствует следующей маски "Имя БД_ДД-ММ-ГГГГ_ччмм.zip" (в именах также могут быть "пробелы"), скрин 1:

https://d.radikal.ru/d31/2201/e5/8edbff93ad51.png

Все папки и файлы создаются автоматически по определенному скрипту, обновляются и дополняются каждый день.
В папках с БД накопилось много архивов и будут копиться дальше, хотелось бы автоматически сортировать все zip файлы.

Нужно чтобы скрипт заходил в каждую папку с БД, перебирал список файлов, определял дату создания файлов каждой папки (в названии файла тоже есть дата создания, можно по маске из имени файла) и создавал папки "ГГГГ", затем внутри "ММ" в каждой конечной папке и далее перемещал все zip файлы в соответствующую папку с "ГГГГ\ММ", скрин 2:

https://d.radikal.ru/d20/2201/e3/a3ef70562257.png

Перебрал много разных вариантов, уже совсем запутался. Буду весьма признателен сообществу единомышленников за помощь!
Всем хорошего дня!

megaloman
26-01-2022, 00:26
Постановка:
Есть "Директория\Папка"
В ней файлы "Директория\Папка\Папка_ДД-ММ-ГГГГ_ччмм.zip"
Их надо рассортировать по подпапкам:
"Директория\Папка\ГГГГ\ММ\Папка_ДД-ММ-ГГГГ_ччмм.zip"
Если это так, то:@Echo Off
cls
Call :MySort "Z:\Box_Arc\APPV012\Leak Detection System"
Call :MySort "Z:\Box_Arc\APPV012\PTM for HVAC"
Call :MySort "Z:\Box_Arc\UATV021\Flert"
pause
Exit /B

:MySort
FOR /L %%y IN (2000,1,2050) DO For %%m In (01 02 03 04 05 06 07 08 09 10 11 12) Do (
If Exist "%~1\%~nx1_??-%%m-%%y_????.zip" (
2>nul Md "%~1\%%y\%%m"
>nul Move "%~1\%~nx1_??-%%m-%%y_????.zip" "%~1\%%y\%%m\"
)
)
Exit /B
Пути пропишИте свои.
Чтобы не возиться с выделением из имен года и месяца, забил диапазон годов 2000 ... 2050
Для времени выполнения, ИМХО, это несущественно

yurfed
26-01-2022, 03:01
забил диапазон годов 2000 ... 2050 »Круто смотрим в будущее.
В 2500 не пробовали заглянуть?

xxx_RedDevil_xxx
26-01-2022, 08:34
megaloman, спасибо вам огромное за ваш труд!
Скрипт отлично обрабатывает содержимое папок и перемещает все файлы по соответствующим каталогам, скрин 3:

https://a.radikal.ru/a37/2201/30/6ad1f72e3a12.png

Вопрос для уточнения, можно ли не в явном виде объявлять пути к конечным проверяемым папкам?
Кол-во папок с названиями серверов могут меняться, особенно сами конечные папки с названиями БД. В разных папках, разное кол-во и они периодически добавляются, скрин 4:

https://c.radikal.ru/c37/2201/e0/ca68b4439970.png

Добавлять их постоянно вручную в скрипт трудоемко.
Можно ли добавить возможность указывать например только изначальную папку откуда нужно начинать проверку, а скрипт сам заходил бы в каждую папку с сервером, далее в ней разное кол-во папок с названиями БД, заходил бы по очереди в каждую папку с названием БД. Далее делал то что было реализовано с файлами и каталогами.

Заранее благодарю.

megaloman
26-01-2022, 09:26
@Echo Off
cls
Set "BoxArc=Z:\_Auto_Export_AF_DB_\Scripts\Sorting_Files_Info_Folders\AF_DB_Backup"

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETime /VALUE') DO Set "YYYY2=%%d"
Set /A YYYY2=%YYYY2:~0,4%
Set /A YYYY1=%YYYY2%-1

FOR /F "usebackq delims=" %%d In (`2^>nul Dir /B /A:D /S "%BoxArc%"`) DO If Exist "%%d\%%~nxd_??-??-2???_????.zip" (
FOR /L %%y IN (%YYYY1%,1,%YYYY2%) DO For %%m In (01 02 03 04 05 06 07 08 09 10 11 12) Do (
If Exist "%%d\%%~nxd_??-%%m-%%y_????.zip" (
2>nul Md "%%d\%%y\%%m"
>nul Move "%%d\%%~nxd_??-%%m-%%y_????.zip" "%%d\%%y\%%m\"
)
)
)
pause
Exit /B
Нарисуйте свой путь.
Круто смотрим в будущее.
В 2500 не пробовали заглянуть? »"Народу русскому пределы не поставлены!"
Чтобы не напрягало, сделал просмотр текущего года и предыдущего (актуально в начале года)
Если, как разовая акция и нужно несколько предыдущих лет, то измените
Set /A YYYY1=%YYYY2%-1
-1 на количество предыдущих годов.

xxx_RedDevil_xxx
26-01-2022, 10:11
megaloman, спасибо вам огромнейшее!!! :Beer: :Beer: :Beer:

Ваш скрипт отлично работает, все "Как доктор прописал!!!".

Прописал только путь к главной директории, далее скрипт обработал все внутренние каталоги и переместил файлы по каталогам, скрин 05:

https://d.radikal.ru/d29/2201/9b/b133ff5cd1a2.png

Осталось только адаптировать в алгоритм текущего сценария, но это уже "мелочи жизни".

Спасибо вам еще раз огромное!

Крепкого всем Здоровья и работоспособных сервисов/систем/скриптов!))

Хорошего дня!!! :)




© OSzone.net 2001-2012