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

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

Ответить
Настройки темы
Любой язык - [решено] Удаление старых файлов-папок по дате изменения (change time)

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


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

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


Приветствую. Долго рылся в поисках решения, но в итоге потерпел фиаско.

Суть проблемы. Есть временная папка, куда сбрасывается разный хлам. Нужно рекурсивно удалять старые файлы/папки, например старше 30 дней. Таких скриптов-программ полно.
Проблема в том, что если извлечь файл из архива, дата создания-изменения-открытия выставляются из архива. Единственная дата, на которую можно ориентироваться, называется "Время изменения" (Change Time). В стандартном проводнике она не выводится, тем не менее, посмотреть её можно, например в фаре:
Скрытый текст

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

Перерыл кучу скриптов.
Forfiles.exe работает не с той датой. PowerShell, похоже, умеет только вот эти даты, и это первые три даты со скрина. Попробовал даже линуксовый find из cygwin, но он видимо вообще не умеет работать с NTFS датами файлов.

Подскажите, как можно работать с такой датой?

Отправлено: 17:21, 08-01-2019

 

Ветеран


Contributor


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

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


Цитата badman:
Forfiles.exe работает не с той датой. »
Цитата YuS_2:
С какой не той? »
badman, Что Вы имеете ввиду? Прочел описание ForFiles, проверил, именно дата изменения. Другое дело, если в старую папку сегодня записать/удалить файл, дата изменения папки станет сегодняшняя.
Цитата YuS_2:
Поэтому каталоги лучше удалять после чистки файлов и только пустые »
Код: Выделить весь код
@Echo Off
	Set "BoxIn=Z:\Soft_In"

	Pushd "%BoxIn%"
	2>nul ForFiles /P "%BoxIn%" /M *.* /S /D -30 /C "cmd /c del "@path""
	For /F "usebackq delims=" %%i In (`2^>nul Dir "%BoxIn%" /B /S /A:D ^|Sort /R`) Do 2>nul Rd "%%i" 
	Popd

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


Последний раз редактировалось megaloman, 09-01-2019 в 12:43.

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

Отправлено: 12:20, 09-01-2019 | #11



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
For /F "usebackq delims=" %%i In (`2^>nul Dir "%BoxIn%" /B /S /A:D ^|Sort /R`) Do Rd "%%i" »
Да, удалит... все каталоги напрочь? Так вроде в задаче совсем не это было...
И к тому же, forfiles работает с обычным lastWriteTime, то бишь, при всём желании, ChangeTime в cmd достать не так просто...

-------
scio me nihil scire. Ѫ


Отправлено: 12:33, 09-01-2019 | #12


Ветеран


Contributor


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

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


YuS_2, Уже увидел и подправил код, чтобы не удалился исходный каталог. Rd без ключей /s /q не удалит непустой каталог.
Цитата badman:
Есть временная папка, куда сбрасывается разный хлам. »
Сильно сомневаюсь, что пустые папки там зачем-то нужны. Это хлам.

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


Отправлено: 12:39, 09-01-2019 | #13


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
Rd без ключей /s /q не удалит непустой каталог. »
это да... и тогда лучше:
Код: Выделить весь код
... do >nul 2>&1 rd %%i
на всякий случай...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 09-01-2019 в 13:21.


Отправлено: 12:42, 09-01-2019 | #14


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


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

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


Цитата badman:
что это за команда? не работает... »
разобрался, надо было обновить powershell и доставить модуль

Отправлено: 12:48, 09-01-2019 | #15


Ветеран


Contributor


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

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


YuS_2, До сих пор считал, что у файла 3 временнЫх атрибута (По крайней мере, доступных в WSH):
Дата создания (DateCreated)
Дата доступа (DateLastAccessed)
Дата изменения (DateLastModified)

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


Отправлено: 13:16, 09-01-2019 | #16


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
у файла 3 временнЫх атрибута »
Файловую систему клепал микрософт - вчера три, завтра два, а позавчера восемь.. такшта, всё возможно.
Вот, выше, коллега Iska, приводил пруфлинки...

Цитата badman:
надо было обновить powershell и доставить модуль »
Ну, тогда скрипт:
Код: Выделить весь код
$fld = 'd:\путь к временному каталогу'
dir -lit $fld -rec -file -force|?{(gi -lit $_.fullname -force|get-itembasicinfo).changetime -lt (get-date).adddays(-30)}|del -force -rec
dir -lit $fld -dir -rec -force|?{(dir -lit $_.fullname -file -rec -force).length -eq 0}|del -rec -force

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 09-01-2019 в 13:52.

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

Отправлено: 13:29, 09-01-2019 | #17


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


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

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


Всем спасибо, скрипт работает как надо

Отправлено: 14:11, 09-01-2019 | #18


Ветеран


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

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


Цитата megaloman:
badman, Что Вы имеете ввиду? Прочел описание ForFiles, проверил, именно дата изменения. »
Это не та дата. Это не DateLastModified.

Цитата megaloman:
YuS_2, До сих пор считал, что у файла 3 временнЫх атрибута (По крайней мере, доступных в WSH):
Дата создания (DateCreated)
Дата доступа (DateLastAccessed)
Дата изменения (DateLastModified) »
Так и есть — именно с этими тремя видами дата/время прямо или опосредованно работают функции WinAPI. Но в файловой системе NTFS есть ещё одно поле для даты-времени — ChangeTime (на FATxx, например, такого поля нет) — широко известный в определённых кругах Рэймонд Чен (Raymond Chen, на самом деле весьма знаковая фигура) в своём блоге поясняет (What’s the difference between LastWriteTime and ChangeTime in FILE_BASIC_INFO? – The Old New Thing):
Цитата:

The FILE_BASIC_INFO structure contains a number of fields which record the last time a particular action occurred. Two of the fields seem to describe the same thing.
Код: Выделить весь код
    Last*Write*Time

        The time the file was last written to.

        Change*Time

            The time the file was changed.
What's the difference between writing to a file and changing it?

I'm told that the difference is metadata. The Last*Write*Time covers writes to the file's data stream (which you accomplish via the Write*File function). On the other hand, the Change*Time also includes changes to the file metadata, such as changing its file attributes (hidden, read-only, etc.) or renaming the file.

(And don't forget that Last*Access*Time updates are off by default now.)
Far Manager умеет работать с данным атрибутом файла (показывать, устанавливать, использовать при поиске, фильтрации и т.п.).

Цитата badman:
Всем спасибо, скрипт работает как надо »
Вот так, совместными усилиями и запинали батьку .
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:44, 09-01-2019 | #19



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удаление старых файлов/папок если их кол-во больше n greenOwl Скриптовые языки администрирования Windows 35 14-01-2023 08:34
CMD/BAT - Архивирование файлов по дате изменения GODolubOFF Скриптовые языки администрирования Windows 7 15-04-2015 20:22
CMD/BAT - [решено] Удаление старых файлов по дате и имени, если их больше n NinjaScript Скриптовые языки администрирования Windows 2 04-03-2015 14:27
CMD/BAT - [решено] Удаление старых файлов по дате (маске) cons74 Скриптовые языки администрирования Windows 2 23-06-2014 08:00
VBS/WSH/JS - [решено] Удаление старых файлов и папок Ua-life Скриптовые языки администрирования Windows 6 05-06-2014 16:45




 
Переход