CMD/BAT - [решено] Удаление большого количества папок и файлов

Аватара пользователя
finderhd

CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение finderhd »

Доброго времени суток!



Имеется каталог с большим количеством папок, подпапок и файлов.



Структура следующая:



Folder_main\YYYYMMDD\Folder1\

далее подкаталоги

FolderXXX\1.dat

FolderYYY\1.dat

FolderZZZ\1.dat



Folder_main\YYYYMMDD\Folder2\

далее подкаталоги

FolderXXX\1.dat

FolderYYY\1.dat

FolderZZZ\1.dat



Folder_main - корневая, главная папка



... и т.д.



может доходить до сотней подкаталогов типа FolderXXX, а соответственно и файлов в каждой из подпапок.

Каждый файл занимает от нескольких байт, то нескольких килобайт (не более 10kb, где-то). Но их количество (как папок так и соответственно, файлов) очень большое, несколько миллионов. Почти за 10 лет. Каталог ежедневно, в одно определенное время, пополняется по принципу - новая папка - новая подпапка - новый файл.

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



Пытался сделать это через Forfiles, но команда удаляет только файлы. Пытался добавить rmdir /s /q но бесполезно, выдает в ошибку о том, что путь не найден и типа того.



FORFILES /p D:\Folder_main\ /s /m *dat* /d -2000 /c "CMD /c del /Q @FILE"



2000 это я указал, чтобы не сразу весь объем...



Думал про вариант с RD, заранее скопировав три главных последних каталога (YYYYMMDD), но т.к. файлов и подпапок очень много, то такой вариант подойдет лишь разово. Да и неизвестно сколько по времени он будет удалять, боюсь, всю память сожрет. А нужно этот процесс поставить на поток, чтобы ежедневно удалял файлы и каталоги за минусом в три дня. Также, не хотелось бы грузить сервер во время удаления, поэтому предполагается удаление такого большого количества файлов и папок(подпапок) частями.



Можно конечно просто запустить в планировщик батник в выходные, и за несколько недель почистить, а папки постепенно удалить вручную, через тот же total, или удалить через rd, как я упомянул выше, т.к. в принципе последние три дня они не критичны.



Подскажите плз, кто сталкивался с подобными задачами, какое лучше решение применить в данном случае?
Аватара пользователя
Ageron

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение Ageron »

@file - возвращает имя файла.



а вам надо указать



@path - возвращает полный путь к файлу.
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение alpap »

Цитата Ageron:



@file - возвращает имя файла.

а вам надо указать

@path - возвращает полный путь к файлу.
CMD/BAT - [решено] Удаление большого количества папок и файлов




Не совсем понятно, что Вы имели в виду? Поставить в конце команды @path вместо @file ?

Попробовал указать, ничего не изменилось.
Аватара пользователя
finderhd

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение finderhd »

Цитата finderhd:



Folder_main\YYYYMMDD\
CMD/BAT - [решено] Удаление большого количества папок и файлов





Цитата finderhd:



Нужно удалить все старые папки вместе с файлами, не трогая последние три.
CMD/BAT - [решено] Удаление большого количества папок и файлов




Если я правильно понял, надо оставить нетронутыми последние 3 папки, допустим:

Folder_main\20200210\

Folder_main\20200205\

Folder_main\20200203\

А предыдущие:

Folder_main\20200202\

Folder_main\20200201\

Folder_main\20200128\

Folder_main\20191231\

.......

удалить.

Код:

Код: Выделить всё

@Echo Off
cls
	Set "BoxIn=Z:\Box_In\Folder_Main"
	Set "Mask=2???????"
	Set /A Skip=3
	FOR /F "usebackq Skip=%Skip% delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:D /O:-N`) Do Call Echo %%Time%% "%BoxIn%\%%f" &Rd /S /Q "%BoxIn%\%%f"
rem pause
Exit /B 0

ИМХО, это максимально быстрый вариант, не думаю, что стОит разбивать этот процесс на части, при такой постановке задачи опускаться до работы с подпапками и удаления файлов не комильфо - преступно медленно.Можете поставить этот скрипт в планировщик и запускать его хоть сто раз в день. Гарантировано останутся три созданные последними папки.

Вставил визуальный контроль процесса, если это не надо - уберите выделенное красным цветом. ОцЕните скорость выполнения - если посчитаете, что всё-таки надо процесс разбить - пишите.
Аватара пользователя
Busla

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение Busla »

Цитата megaloman:



не думаю, что стОит разбивать этот процесс на части, при такой постановке задачи опускаться до работы с подпапками и удаления файлов не комильфо - преступно медленно.
CMD/BAT - [решено] Удаление большого количества папок и файлов




Да нет, нормально будет, хоть спускаясь рекурсией внутрь по дереву (я бы так и делал — спускался вниз рекурсией, удалял старые файлы, а на возврате из рекурсии вверх проверял каталог на пустоту и, если это так — тогда удалял бы его).



P.S. Первый раз можно и «ручками» удалить Изображение.
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение megaloman »

Busla, Обратите внимание, я адресовал Вам пост и излагал мысли в рамках деловой этики. Должен заметить, у меня за спиной более десятка лет успешного обслуживания серьезной информационной системы. Вы не привели ни одного внятного довода моей неправоты, не предложили своего, на Ваш взгляд, правильного решения. Тролльте, если Вам так нравится. Но далее без меня.
Аватара пользователя
finderhd

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение finderhd »

finderhd, а не хотите отталкиваться от даты создания файла вместо "трёх последних папок"?
Аватара пользователя
Ageron

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение Ageron »

Вот вариант с ограничением количества удаленных папкодней

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
cls
	Set "BoxIn=Z:\Box_In\Folder_Main"
	Set "Mask=2???????"
	Set /A Skip=3
	Set /A MaxCount=365
	FOR /F "usebackq Skip=%Skip% delims=" %%d IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:D /O:-N`) Do Set /A MaxDay=%%~nd &GoTo :Begin
	:Begin
	Set /A iCount=0
	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:D /O:N`) Do (
		If %MaxDay% GEQ %%f (
			Rd /S /Q "%BoxIn%\%%f"
			Call :Counter || GoTo :End
		)
	)
	:End
rem pause
Exit /B 0
:Counter
	Set /A iCount+=1
	If %iCount% EQU %MaxCount% Exit /B 1
Exit /B 0

Set "BoxIn=Z:\Box_In\Folder_Main" - здесь пропишИте свой путь

Set /A Skip=3 -здесь количество дней, которые нужно оставить

Set /A MaxCount=365 -здесь количество дней (не более), удаляемых за один запуск батника.

Батник можно поместить в планировщик, запускать хоть раз в день, хоть несколько (надо при этом быть уверенным, что предыдущий запуск уже успел отработать).

При указанных параметрах и если задание в планировщике запускать раз в сутки, за 10 дней 10 лет Вы убьете и в последующем будут всегда оставаться три последних дня.
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение megaloman »

Цитата megaloman:



Iska, в чём смысл?
CMD/BAT - [решено] Удаление большого количества папок и файлов




В большей гибкости. Когда внутри могут оказаться файлы возрастом много младше каталогов, например.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Удаление большого количества папок и файлов

Сообщение Iska »

Цитата Iska:



Когда внутри могут оказаться файлы возрастом много младше каталогов, например.
CMD/BAT - [решено] Удаление большого количества папок и файлов




Их нет, даже если они существуют. При том количестве файлов если какой-то файл нарушает чем-то порядок хранения - его нет. А если работает автоматизированная система- то их и в принципе быть не должно.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»