Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление большого количества папок и файлов

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

Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: finderhd
Дата: 12-02-2020
Доброго времени суток!

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

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

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, как я упомянул выше, т.к. в принципе последние три дня они не критичны.

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

Отправлено: 11:19, 12-02-2020

 

Старожил


Сообщения: 427
Благодарности: 72

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 13:00, 12-02-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Ageron:
@file - возвращает имя файла.
а вам надо указать
@path - возвращает полный путь к файлу. »
Не совсем понятно, что Вы имели в виду? Поставить в конце команды @path вместо @file ?
Попробовал указать, ничего не изменилось.

Отправлено: 13:42, 12-02-2020 | #3


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата finderhd:
Folder_main\YYYYMMDD\ »
Цитата finderhd:
Нужно удалить все старые папки вместе с файлами, не трогая последние три. »
Если я правильно понял, надо оставить нетронутыми последние 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
ИМХО, это максимально быстрый вариант, не думаю, что стОит разбивать этот процесс на части, при такой постановке задачи опускаться до работы с подпапками и удаления файлов не комильфо - преступно медленно.Можете поставить этот скрипт в планировщик и запускать его хоть сто раз в день. Гарантировано останутся три созданные последними папки.
Вставил визуальный контроль процесса, если это не надо - уберите выделенное красным цветом. ОцЕните скорость выполнения - если посчитаете, что всё-таки надо процесс разбить - пишите.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 14-02-2020 в 14:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:27, 12-02-2020 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
не думаю, что стОит разбивать этот процесс на части, при такой постановке задачи опускаться до работы с подпапками и удаления файлов не комильфо - преступно медленно. »
Да нет, нормально будет, хоть спускаясь рекурсией внутрь по дереву (я бы так и делал — спускался вниз рекурсией, удалял старые файлы, а на возврате из рекурсии вверх проверял каталог на пустоту и, если это так — тогда удалял бы его).

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

Отправлено: 01:03, 13-02-2020 | #5


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Iska, в чём смысл? Вижу цель - оставить несколько последних по датам в имени папок. Счюпать каждый файл - никакого смысла.
Если уж очень хочется, то и рекурсия - не оптимум. ИМХО эффективнее сделать dir папок и конвейером на обратную сортировку. Убивать в папке файлы и после удаления файлов удалять папку без /s /q.
Но это по времени не знаю на сколько порядков медленнее, чем удалять сразу старые папки.
Эх, не хватает оценки, сколько тратится времени на удаление каждого дня.
Если принять, что за 10 лет создалось 3600 папок по дням и если каждая папка удаляется 1сек, то это уже 1 час.
Кстати, echo в моём коде наверное может хорошо замедлить процесс.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 12:11, 13-02-2020 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 16:33, 13-02-2020 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Вот вариант с ограничением количества удаленных папкодней
Код: Выделить весь код
@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, 13-02-2020 в 17:51.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:42, 13-02-2020 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Iska, в чём смысл? »
В большей гибкости. Когда внутри могут оказаться файлы возрастом много младше каталогов, например.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:35, 13-02-2020 | #9


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 19:00, 13-02-2020 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление большого количества папок и файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Проблема с просмотром большого количества файлов в explorer Pikki-pikki Microsoft Windows 2000/XP 8 30-05-2021 00:24
Система - [решено] проверка целостности большого количества файлов daneeall Программное обеспечение Windows 7 08-02-2013 16:25
Система - Подскажите программу для копирования / перемещения большого количества мелких файлов kiripanda Программное обеспечение Windows 13 10-08-2010 21:00
Интерфейс - [решено] Переименование большого количества файлов 7human7 Microsoft Windows 2000/XP 7 22-11-2008 09:48
Flash - Проблема копирования большого количества файлов в корневой каталог флешки SANIOK_AV Накопители (SSD, HDD, USB Flash) 2 05-09-2008 11:43




 
Переход