Страница 1 из 1

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

Добавлено: 2012-06-22 14:56:13
mmvds
Люди добрые, подскажите как создать цикл по датам и времени каждые 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? Не соображу, как сделать такой цикл? Список файлов должен быть непрерывным

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

Добавлено: 2012-06-22 15:53:34
rmn

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

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%

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

Добавлено: 2012-06-22 18:01:26
rayder
наваял тут на скорую руку (т.к. пора уходить с работы).
рисует диапазоны от начала этого года, до текущего времени.
думаю дальше разберешься, дальше сам

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

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

#!/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

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

Добавлено: 2012-06-23 23:27:25
kpp
Если обобщить вышесказанное, имеем:

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

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

Добавлено: 2012-06-25 8:33:58
mmvds
kpp, rayder, rmn Большое спасибо! Буду разбираться со всеми вариантами

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

Добавлено: 2012-06-25 18:52:01
mmvds
Возможно кому-то пригодится вариант под 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

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

Добавлено: 2012-06-25 20:12:21
kpp
Уточнять нужно, уважаемый mmvds, под какую ОС нужен скрипт.
Если ОС явно не указана - значит FreeBSD.

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

Добавлено: 2012-06-26 8:11:11
mmvds
Я и не в претензии, наоборот очень помогли :)

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

Добавлено: 2012-06-26 9:43:06
rayder
я бы сказал "направили на путь истинный в сторону `date`" :))