Цикл по датам и времени

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Цикл по датам и времени

Непрочитанное сообщение mmvds » 2012-06-22 14:56:13

Люди добрые, подскажите как создать цикл по датам и времени каждые 10 минут за определенный период?
Хочу разбить файл с кучей перемешанных данных во времени на файлы со следующими именами год-месяц-число-час-минуты.txt с промежутком в именах каждые 10 минут начиная например с 1 января этого года и до текущей даты
т.е. Как создать пустые файлы 2012-01-01-00-00.txt, 2012-01-01-00-10.txt, 2012-01-01-00-20.txt ... 2012-06-22-15-30.txt, 2012-06-22-15-40.txt? Не соображу, как сделать такой цикл? Список файлов должен быть непрерывным

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: Цикл по датам и времени

Непрочитанное сообщение rmn » 2012-06-22 15:53:34

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

remcomp% cat test.sh
#!/bin/sh

start_date="2012-06-01 00:00"

datecmd="/bin/date"
startfmt="%Y-%m-%d %H:%M"
filefmt="%Y_%m_%d_%H_%M"

file_ts="`$datecmd -jf "$startfmt" "$start_date" +"%s"`"
now_ts="`$datecmd +"%s"`"

while true
do
    file_name="`$datecmd -jf "%s" "$file_ts" +"$filefmt"`.log"
    echo $file_name

    file_ts="`$datecmd -v+10M -jf "%s" "$file_ts" +"%s"`"
    if [ $file_ts -ge $now_ts ]; then
        break
    fi
done

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

remcomp% ./test.sh > /tmp/out.dat
remcomp% head /tmp/out.dat
2012_06_01_00_00.log
2012_06_01_00_10.log
2012_06_01_00_20.log
2012_06_01_00_30.log
2012_06_01_00_40.log
2012_06_01_00_50.log
2012_06_01_01_00.log
2012_06_01_01_10.log
2012_06_01_01_20.log
2012_06_01_01_30.log
remcomp% tail /tmp/out.dat
2012_06_22_14_20.log
2012_06_22_14_30.log
2012_06_22_14_40.log
2012_06_22_14_50.log
2012_06_22_15_00.log
2012_06_22_15_10.log
2012_06_22_15_20.log
2012_06_22_15_30.log
2012_06_22_15_40.log
2012_06_22_15_50.log
remcomp%

rayder
лейтенант
Сообщения: 661
Зарегистрирован: 2008-12-18 16:29:43
Откуда: Ukraine/Kiev
Контактная информация:

Re: Цикл по датам и времени

Непрочитанное сообщение rayder » 2012-06-22 18:01:26

наваял тут на скорую руку (т.к. пора уходить с работы).
рисует диапазоны от начала этого года, до текущего времени.
думаю дальше разберешься, дальше сам

ЗЫ. некоторые вещи можно сделать красивее, но лень было замарачиваться

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

#!/bin/sh
cur_day=`date '+%j'`
cur_m=`date '+%M'`
cur_h=`date '+%H'`
cur_s=`date '+%S'`
cur_stamp=`date '+%s'`
cur_day=$(($cur_day-1))

secd=`echo "(${cur_day}*24*60*60)+((${cur_h}-1)*3600)+((${cur_m})*60)+${cur_s}" | bc -l`

stamp=`echo "$cur_stamp-$secd" | bc`

while [ $stamp -lt $cur_stamp ];
do
   fname=`date -r $stamp '+%Y%m%d%H%M'`
   echo $fname
   stamp=$(($stamp+600))
done
Человеку свойственно ошибаться, но для нечеловеческих ляпов нужен компьютер.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Цикл по датам и времени

Непрочитанное сообщение kpp » 2012-06-23 23:27:25

Если обобщить вышесказанное, имеем:

script.sh

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

#!/bin/sh

datecmd="/bin/date"

begin="${1}"
end="${2}"

# формат границ промежутка
f_limit="%Y%m%d%H%M"
# формат имени файла
f_out="+%Y-%m-%d-%H-%M.log"
# интервал в секундах
r_interval=600

r_begin=`${datecmd} -j -f "${f_limit}" "${begin}" "+%s"`
r_end=`${datecmd} -j -f "${f_limit}" "${end}" "+%s"`
r_current=${r_begin}

while [ ${r_current} -le ${r_end} ]
do
  file_name=`${datecmd} -r ${r_current} "${f_out}"`
  echo ${file_name}
  r_current=`expr ${r_current} + ${r_interval}`
done
Пример выполнения:

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

sh ./script.sh 201206232250 201206232340
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Цикл по датам и времени

Непрочитанное сообщение mmvds » 2012-06-25 8:33:58

kpp, rayder, rmn Большое спасибо! Буду разбираться со всеми вариантами

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Цикл по датам и времени

Непрочитанное сообщение mmvds » 2012-06-25 18:52:01

Возможно кому-то пригодится вариант под linux (немного другие ключи)

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

cur_stamp=`date '+%s'`
stamp=`date -d "2012-05-01 00:00:00" '+%s'`

while [ $stamp -lt $cur_stamp ];
do
   dname=`date -d @$stamp '+%Y-%m-%d-%H-%M.log'`
   echo $dname
   stamp=$(($stamp+600))
done

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Цикл по датам и времени

Непрочитанное сообщение kpp » 2012-06-25 20:12:21

Уточнять нужно, уважаемый mmvds, под какую ОС нужен скрипт.
Если ОС явно не указана - значит FreeBSD.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Цикл по датам и времени

Непрочитанное сообщение mmvds » 2012-06-26 8:11:11

Я и не в претензии, наоборот очень помогли :)

rayder
лейтенант
Сообщения: 661
Зарегистрирован: 2008-12-18 16:29:43
Откуда: Ukraine/Kiev
Контактная информация:

Re: Цикл по датам и времени

Непрочитанное сообщение rayder » 2012-06-26 9:43:06

я бы сказал "направили на путь истинный в сторону `date`" :))
Человеку свойственно ошибаться, но для нечеловеческих ляпов нужен компьютер.