Страница 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
Пример выполнения:
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`"

)