Иногда бывает необходимо удалять файлы старше определенного возраста, причем нужно повторять эту операцию многократно. Как быть в таком случае? Пользователям Unix сразу напрашивается мысль – crontab. Оказывается, в среде Windows тоже можно выполнять по расписанию задания в формате crontab. На помощь приходит программа nncron, которая еще и бесплатна для жителей бывшего СССР.
Также в статье приведены скрипты для автоматического удаления файлов по дате на PowerShell и с помощью утилиты FORFILES.
Описывать процесс установки я не буду, процесс регистрации описан в русском руководстве к программе.
Итак, средствами программы создаем новый crontab файл, в который вписываем:
# CRONTAB FILE
#( del-files
\ удаляем все файлы и каталоги, чья дата
\ последней записи превышает 3 дней
\ запуская задачу каждые сутки в 00:00
Time: 0 0 * * * *
Action:
RECURSIVE
WITHDIRS
PURGE-OLDW: "I:\Backup\Database\1\*" 3
)#
Внесем ясность:
del-files – название задания
Time: 0 0 * * * * - выполнять запуск в 00-00 каждый день, формат выглядит следующим образом:
a b c d e f, где
a – минуты
b – часы
c – дни месяца
d – месяцы
e –дни недели
f –годы
Примеры:
· * * * * * - каждую минуту
· 59 23 31 12 5 * - за минуту до конца года, если последний день-пятница
· 0 0 * * 3 * - каждую среду в полночь
RECURSIVE – удалять файлы (папки) рекурсивно
WITHDIRS – удалять включая папки и подпапки
PURGE-OLDW: "I:\Backup\Database\1\*" 3 – удалить все файлы из папки I:\Backup\Database\1\ в том случае, если их возраст 3 и более дней.
Скрипт на PowerShell:
dir *.txt | where {$_.lastwritetime -ge (get-date).adddays(-30)} | #Выбираем файлы старше 30 дней
foreach {
add-content log.txt $_.fullname #Пишем полный путь к файлу в лог
copy $_ x:\archieve\ #Копируем файл в архив
del $_ #Удаляем исходный файл
}
С помощью утилиты FORFILES:
@ECHO OFF
REM Мочим сперва файло (@isdir==FALSE) старше 5-ти дней (-d -5)
FORFILES -p "c:\some\path\to\folder" -s -m * -d -5 -c "CMD /C if @isdir==FALSE DEL /f /q @path"
REM Опосля мочим папки (@isdir==TRUE) старше 1-го дня (-d -1)
FORFILES -p "c:\some\path\to\folder" -s -m * -d -1 -c "CMD /C if @isdir==TRUE RMDIR /q @path"
EXIT /B 0