Удаление файлов по дате.

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
m_gol
Сообщения: 2
Зарегистрирован: 03 фев 2017, 09:35

Всем здрасти! Подключил к своему RB951Ui-2HnD внешний диск для бекапов. Помогите со скриптом удаления всего, что старше определенной даты. :du_ma_et:


arten
Сообщения: 1
Зарегистрирован: 16 фев 2017, 12:57

Держи.
Например этот скрипт удаляет все файлы старше 7 дней, которые лежат на disk1
Механизм выборки файлов взят отсюда, я добавил команду удаления.

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

# Only delete files older than X days ago
# tested on RouterOS v6.38.1
{
   # how many days ago
   :local daysAgo 7;
   
   # only delete files that contain this in their name
   :local filter "disk1/*";

   # months array
   :local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
   # get current date
   :local curDate [ /system clock get date ];
   # extract current month
   :local curMonth [ :pick $curDate 0 3 ];
   # get position of our month in the array = month number
   :set curMonth ([ :find $months $curMonth -1 ] + 1);
   # extract current day
   :local curDay [ :pick $curDate 4 6 ];
   # extract current year
   :local curYear [ :pick $curDate 7 11 ];

   # loop through all files
   :foreach i in=[/file find] do={
      # get this file's creation time
      :local fileDate [/file get number="$i" creation-time]
      # extract the date
      :set fileDate [ :pick $fileDate 0 11 ];
      # extract the month
      :local fileMonth [ :pick $fileDate 0 3 ];
      # get position of our month in the array = month number
      :set fileMonth ([ :find $months $fileMonth -1 ] + 1);
      # extract the day
      :local fileDay [ :pick $fileDate 4 6 ];
      # extract the year
      :local fileYear [ :pick $fileDate 7 11 ];
     
      # the sum of total days
      :local sum 0;
      # subtract the file's year from the current year, multiply times 365 to get approx days, add to sum
      :set sum ($sum + (($curYear - $fileYear)*365));
      # subtract the file's month from the current month, multiply times 30 to get approx days, add to sum
      :set sum ($sum + (($curMonth - $fileMonth) * 30));
      # subtract the file's day from the current day, add to sum
      :set sum ($sum + ($curDay - $fileDay));
      # if the sum is greater than or equal to our daysAgo and the file name contains our filter
      :if ($sum >= $daysAgo && [/file get number="$i" name]~"$filter") do={
         # delete files
         /file remove [find name~"$filter"];
      }
   }
}


m_gol
Сообщения: 2
Зарегистрирован: 03 фев 2017, 09:35

Он мне все удаляет :) Создаю файл, выполняю скрипт, файла нет. Дата на роутере установлена правильно.


attl
Сообщения: 7
Зарегистрирован: 12 янв 2014, 01:51

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

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

# Only delete files older than X days ago
# tested on RouterOS v6.39.1
{
# how many days ago 
:local daysAgo 7;
# only delete files that contain this in their name
:local filter "video";
# months array
:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
# get current date
:local curDate [ /system clock get date ];
# extract current month
:local curMonth [ :pick $curDate 0 3 ];
# get position of our month in the array = month number
:set curMonth ([ :find $months $curMonth -1 ] + 1);
# extract current day
:local curDay [ :pick $curDate 4 6 ];
# extract current year
:local curYear [ :pick $curDate 7 11 ];
# loop through all files
 :foreach i in=[/file find] do={
# get this file's creation time
:local fileDate [/file get number="$i" creation-time]
# extract the date
:set fileDate [ :pick $fileDate 0 11 ];
# extract the month
:local fileMonth [ :pick $fileDate 0 3 ];
# get position of our month in the array = month number
: set fileMonth ([ :find $months $fileMonth -1 ] + 1);
# extract the day
:local fileDay [ :pick $fileDate 4 6 ];
# extract the year
:local fileYear [ :pick $fileDate 7 11 ];
#extract file name       
:local fileName [/file get number="$i" name ];
# the sum of total days
:local sum 0;
# subtract the file's year from the current year, multiply times 365 to get approx days, add to sum
:set sum ($sum + (($curYear - $fileYear)*365));
# subtract the file's month from the current month, multiply times 30 to get approx days, add to sum
:set sum ($sum + (($curMonth - $fileMonth) * 30));
# subtract the file's day from the current day, add to sum
:set sum ($sum + ($curDay - $fileDay));
# if the sum is greater than or equal to our daysAgo and the file name contains our filter
:if ($sum >= $daysAgo && [/file get number="$i" name]~"$filter") do={
# delete files
/file remove [find name~"$fileName"];
}
}
}


Cool_Mike
Сообщения: 4
Зарегистрирован: 09 ноя 2018, 10:33

Всем привет. Сразу скажу, что в написании скриптов я полный ноль. Поэтому нужна помощь с запуском и работой данного скрипта. Суть в том, что я с камеры наблюдения направил запись на СД-карту, которая вставлена в роутер, подняв на нём ftp-сервер. Всё работает замечательно, пока СД-карта не заполнена целиком )))
Учитывая, что в роутере нет встроенного механизма удаления файлов, попробовал установить скрипт, описанный в данной теме. Хочу посоветоваться, всё ли правильно сделал. Зашёл в роутер через winbox и в меню \system\script создал скрипт и перенёс данный текст и нажал на кнопку Run Script. Для пробы установил интервал удаления в два дня. Теперь вопрос - в меню script\jobs он автоматически не появился. А должен он появляться? И если роутер перезагрузить, скрипт будет запускаться автоматически или каждый раз нужно заходить в меню \system\script и нажимать Run Script?
В одном уроке на Ютьбе было сказано, что для автоматического запуска пользовательского скрипта достаточно файл со скриптом обозвать myscript.auto.scr и поместить на СД-карту и, мол, система его сразу же запустит. Сразу попробовал именно так. Но понять, работает скрипт или нет, мне трудно.

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


Cool_Mike
Сообщения: 4
Зарегистрирован: 09 ноя 2018, 10:33

Ага... Посмотрел на Wiki синтаксис циклов в скриптовом языке. Просто написать как в Си "for (;;) {};" или "while (1){};" и поместить туда тело данного скрипта не получиться. Однако, есть конструкция, аналогичная Си - do... while (); Думаю, что это поможет зациклить данный скрипт, что бы в ручную не заходить и не запускать данный скрипт для автоматического удаления файлов старше 30-ти дней. Т.е. нечто подобное :do {"script body"} while (1);


KARaS'b
Сообщения: 1199
Зарегистрирован: 29 сен 2011, 09:16

Cool_Mike писал(а): 09 ноя 2018, 13:31 Ага... Посмотрел на Wiki синтаксис циклов в скриптовом языке. Просто написать как в Си "for (;;) {};" или "while (1){};" и поместить туда тело данного скрипта не получиться. Однако, есть конструкция, аналогичная Си - do... while (); Думаю, что это поможет зациклить данный скрипт, что бы в ручную не заходить и не запускать данный скрипт для автоматического удаления файлов старше 30-ти дней. Т.е. нечто подобное :do {"script body"} while (1);
Для автоматического выполнения есть шедулер.


Cool_Mike
Сообщения: 4
Зарегистрирован: 09 ноя 2018, 10:33

Ну да, или через планировщик можно. Попробую сегодня. В целом хотел узнать в правильном ли направлении двигаюсь.


Cool_Mike
Сообщения: 4
Зарегистрирован: 09 ноя 2018, 10:33

Скрипт не работал, пока в массиве месяцев не поставил первые буквы заглавными... Ну может кому пригодится данная инфа.


maksim.geynsberg
Сообщения: 1
Зарегистрирован: 02 окт 2020, 14:31

Скриптик хороший, взял себе на вооружение, единственное НО автору который "добавил удаление" - удаляет все файлы в имени которых есть ~filter. Немного подшаманив поправил издержки.
Добавил фильтр по типу файла(для большей безопасности) в строке.

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

   :foreach i in=[/file find type=backup] do={
Вот весь код, надеюсь кому помог :men:

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

{
   :local daysAgo 30;
   :local filter "disk1/";

   :local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
   :local curDate [ /system clock get date ];
   :local curMonth [ :pick $curDate 0 3 ];
   :set curMonth ([ :find $months $curMonth -1 ] + 1);
   :local curDay [ :pick $curDate 4 6 ];
   :local curYear [ :pick $curDate 7 11 ];
   :foreach i in=[/file find type=backup] do={
      :local fileDate [/file get number="$i" creation-time]
      :set fileDate [ :pick $fileDate 0 11 ];
      :local fileMonth [ :pick $fileDate 0 3 ];
      :set fileMonth ([ :find $months $fileMonth -1 ] + 1);
      :local fileDay [ :pick $fileDate 4 6 ];
      :local fileYear [ :pick $fileDate 7 11 ];
      :local sum 0;
      :set sum ($sum + (($curYear - $fileYear)*365));
      :set sum ($sum + (($curMonth - $fileMonth) * 30));
      :set sum ($sum + ($curDay - $fileDay));
      :if ($sum >= $daysAgo && [/file get number="$i" name]~"$filter") do={
         /file remove $i;
      }
   }
}


Ответить