Показать полную графическую версию : [решено] Удаление старых файлов-папок по дате изменения (change time)
Приветствую. Долго рылся в поисках решения, но в итоге потерпел фиаско.
Суть проблемы. Есть временная папка, куда сбрасывается разный хлам. Нужно рекурсивно удалять старые файлы/папки, например старше 30 дней. Таких скриптов-программ полно.
Проблема в том, что если извлечь файл из архива, дата создания-изменения-открытия выставляются из архива. Единственная дата, на которую можно ориентироваться, называется "Время изменения" (Change Time). В стандартном проводнике она не выводится, тем не менее, посмотреть её можно, например в фаре:
https://monosnap.com/image/aDob5IBDJL9fadgaZ5nxPF8QYsIOmc.png
Как видно, первые три даты в прошлом, и только последняя отражает текущее время создания файла. Поскольку я довольно часто работаю с архивами, удаление мусора внезапно стало проблемой.
Перерыл кучу скриптов.
Forfiles.exe работает не с той датой. PowerShell, похоже, умеет только вот эти (https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-getfiletime) даты, и это первые три даты со скрина. Попробовал даже линуксовый find из cygwin, но он видимо вообще не умеет работать с NTFS датами файлов.
Подскажите, как можно работать с такой датой?
В стандартном проводнике она не выводится »
Почему не выводится?
http://rgho.st/6HVxGqz9j/thumb.png (http://rgho.st/6HVxGqz9j.view)
Как видно »
А вот не видно... ничего.
Forfiles.exe работает не с той датой. »
С какой не той?
PowerShell, похоже, умеет только вот эти даты »
Powershel легко работает с такими датами:
CreationTime,CreationTimeUtc,LastAccessTime,LastAccessTimeUtc,LastWriteTime,LastWriteTimeUtc
работать с такой датой? »
С такой - это с какой именно?
Почему не выводится? »
Повторюсь, именно последняя дата со скрина фара не выводится нигде, я всё проклацал
Вот тот же файл в проводнике
https://monosnap.com/image/DxDYiMQj6WSQr7VhcYK0xwhxWvb5QX.png
Как видите, нигде нет 08.01.2019
Powershel легко работает с такими датами: »
Даты там всего 3 и они не отображают нужную, я проверил. *Utc не считаются, это просто время с часовым поясом UTC0
https://monosnap.com/image/6zMCmTonhYvHHTWPqGID3LmX0Dus39.png
$_.Name + "`t`t" + $_.CreationTime + "`t" + $_.LastWriteTime + "`t" + $_.LastAccessTime
С такой - это с какой именно? »
Первый пост, скрин, "Время изменения"
Вот тот же файл в проводнике »
Как видите »
Говорю же, ничего не видно, у этого хостинга левый сертификат, браузер отказывается отображать с него картинки :)
Даты там всего 3 и они не отображают нужную, я проверил. »
плохо проверялось...
А удалить файлы по параметру времени последнего изменения:
$fld = 'd:\путь к временному каталогу'
dir -lit $fld -rec -file|?{$_.lastwritetime -lt (get-date).adddays(-30)}|del -force -rec
а вот каталоги... можно, конечно и их рекурсивно удалять, но тут может возникнуть противоречие: у каталога дата изменения старше 30 дней, а вот у файлов находящихся в нем, дата может быть и свежее. Поэтому каталоги лучше удалять после чистки файлов и только пустые:
dir -lit $fld -dir -rec -force|?{(dir -lit $_.fullname -file -rec).length -eq 0}|del -rec -force
- эту строку надо добавить к скрипту удаления файлов...
у этого хостинга левый сертификат »
нормальный там сертификат
Подскажите, как можно работать с такой датой? »
Стандартными средствами — не особо. Это не WinAPI, это NativeAPI: Свойства файла: Change time - forum.farmanager.com (https://forum.farmanager.com/viewtopic.php?t=8102), NtQueryInformationFile function - Windows driver | Microsoft Docs (https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntifs/nf-ntifs-ntqueryinformationfile) → _FILE_BASIC_INFORMATION - Windows driver | Microsoft Docs (https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/ns-wdm-_file_basic_information).
А вот не видно... ничего. »
У меня под Pale Moon видно. Там редирект ссылки файла изображения на облачное хранилище происходит.
нормальный там сертификат »
Там редирект ссылки файла изображения на облачное хранилище происходит. »
Особо не разбирался... но FF выдал:
Ошибка при установлении защищённого соединения
При соединении с monosnap.com произошла ошибка. Узел получил действительный сертификат, но в доступе было отказано. Код ошибки: SSL_ERROR_ACCESS_DENIED_ALERT
Страница, которую вы пытаетесь просмотреть, не может быть отображена, так как достоверность полученных данных не может быть проверена.
Пожалуйста, свяжитесь с владельцами веб-сайта и проинформируйте их об этой проблеме.
Maxthon :
Недействительный сертификат
Сертификат этого сайта истёк или был выпущен для другого адреса.
Это может указывать на попытку перехвата данных между вами и удаленным сервером.
Проверьте, является ли URL в адресной строке правильным.
Код ошибки 117 (net::ERR_BAD_SSL_CLIENT_AUTH_CERT)
Мне этого хватило, чтобы плюнуть на тот хостинг... :)
Если бы проблема была у меня, мне, возможно, было бы интересно разобраться в возникающих ошибках, а так...
Стандартными средствами — не особо. »
Кстати, если очень хочется именно changetime (хотя, лично я, не представляю зачем оно вообще нужно), для powershell есть модуль, от имени админа:
install-module psbasicinfo
затем:
(gi filename.ext|get-itembasicinfo).changetime
всё...
для powershell есть модуль, от имени админа:
install-module psbasicinfo »
что это за команда? не работает...
что это за команда? »
man install-module -full
не работает... »
А это работает:
find-module psbasicinfo
?
megaloman
09-01-2019, 12:20
Forfiles.exe работает не с той датой. »С какой не той? »badman, Что Вы имеете ввиду? Прочел описание ForFiles, проверил, именно дата изменения. Другое дело, если в старую папку сегодня записать/удалить файл, дата изменения папки станет сегодняшняя.Поэтому каталоги лучше удалять после чистки файлов и только пустые »
@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
For /F "usebackq delims=" %%i In (`2^>nul Dir "%BoxIn%" /B /S /A:D ^|Sort /R`) Do Rd "%%i" »
Да, удалит... все каталоги напрочь? :) Так вроде в задаче совсем не это было...
И к тому же, forfiles работает с обычным lastWriteTime, то бишь, при всём желании, ChangeTime в cmd достать не так просто...
megaloman
09-01-2019, 12:39
YuS_2, Уже увидел и подправил код, чтобы не удалился исходный каталог. Rd без ключей /s /q не удалит непустой каталог. Есть временная папка, куда сбрасывается разный хлам. » Сильно сомневаюсь, что пустые папки там зачем-то нужны. Это хлам.
Rd без ключей /s /q не удалит непустой каталог. »
это да... и тогда лучше:
... do >nul 2>&1 rd %%i
на всякий случай...
что это за команда? не работает... »
разобрался, надо было обновить powershell и доставить модуль
megaloman
09-01-2019, 13:16
YuS_2, До сих пор считал, что у файла 3 временнЫх атрибута (По крайней мере, доступных в WSH):
Дата создания (DateCreated)
Дата доступа (DateLastAccessed)
Дата изменения (DateLastModified)
у файла 3 временнЫх атрибута »
Файловую систему клепал микрософт - вчера три, завтра два, а позавчера восемь.. такшта, всё возможно. :)
Вот (http://forum.oszone.net/post-2850663.html#post2850663), выше, коллега Iska, приводил пруфлинки...
надо было обновить 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
Всем спасибо, скрипт работает как надо
badman, Что Вы имеете ввиду? Прочел описание ForFiles, проверил, именно дата изменения. »
Это не та дата. Это не DateLastModified.
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 (https://blogs.msdn.microsoft.com/oldnewthing/20100709-00/?p=13463/)):
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 (http://blogs.technet.com/filecab/archive/2006/11/07/disabling-last-access-time-in-windows-vista-to-improve-ntfs-performance.aspx).)
Far Manager умеет работать с данным атрибутом файла (показывать, устанавливать, использовать при поиске, фильтрации и т.п.).
Всем спасибо, скрипт работает как надо »
Вот так, совместными усилиями и запинали батьку ;).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.