URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8331
[ Назад ]

Исходное сообщение
"Как задать последний день прошлого месяца?"

Отправлено nastr , 27-Июн-09 11:55 
На удалённом сервере каждый час создаётся новый файл, который именуется так - filename_$(date "+%Y_%m_%d_%H")_00_00.cvs, в кроне установлен скрипт который запскается в 01 минуту каждый час, и крирует по ftp файл за предидущий час. Задача казалось бы не сложная.
задаю переменные для указания что копировать по ftp:
if [ `date "+%H"` -eq 00 ]
then
var=filename_$(date "+%Y_%m")_$(expr $(date "+%d") - 1)_23_00_00.cvs
else
var=filename_$(date "+%Y_%m_d")_$(expr $(date "+%H") - 1)_00_00.cvs
fi
Но как быть если к примеру сегодня 01 число?
Ведь $(expr $(date "+%d") - 1) выдаст мне 00, а мне жунно к примеру 31 (количество дней в прошлом месяце).
Как задать предидущий день, час, не по средствам функции expr, вычитания единицы?

Содержание

Сообщения в этом обсуждении
"Как задать последний день прошлого месяца?"
Отправлено Andrey , 27-Июн-09 21:47 
если сегодня 1-е то можно использовать
date -d yesterday +%d

"Как задать последний день прошлого месяца?"
Отправлено Sarge , 27-Июн-09 23:02 
вообще вся задача решается с помощью добавления к date параметра:
-d "-1 hour"

"Как задать последний день прошлого месяца?"
Отправлено allez , 28-Июн-09 17:49 
>Как задать предидущий день, час, не по средствам функции expr, вычитания единицы?

А какая ОС на сервере установлена? Если Linux, то приведенные выше советы сработают,
если же что-то другое - то очень даже могут и не сработать.

P. S. Сообщать о том, какая ОС используется - элементарное правило хорошего тона. ;-)


"Как задать последний день прошлого месяца?"
Отправлено nastr , 30-Июн-09 16:51 
>А какая ОС на сервере установлена? Если Linux, то приведенные выше советы
>сработают,
>если же что-то другое - то очень даже могут и не сработать.
>P. S. Сообщать о том, какая ОС используется - элементарное правило хорошего
>тона. ;-)

Спасибо большое за совет.
На одном сервере под Win2003, установлен cygwin, на нём date -d работает нормально.
Остальные сервера работают под SunOS там date -d не работает.
Пока что на срверах под SunOS использую слудущую конструкцию скрипта
g=0; while true
do
if [ $(date "+%M") -eq 00 ] && [ $g -ne 1 ] && [ $(date "+%H") -ne 00 ]
then
sleep 3
newstr=$(tail -1 perf_VoMSRechargeExt_`date "+%Y_%m_%d_$(expr $(date "+%H") - 1)"`*.csv)
case $newstr in
$str);;
*) echo $newstr;;
esac
g=1
sleep 13
elif [ $(date "+%H") -eq 00 ] && [ $g -ne 1 ] && [ $(date "+%M") -eq 00 ]
then
sleep 3
newstr=$(tail -1 perf_VoMSRechargeExt_`date "+%Y_%m_$(expr $(date "+%d") - 1)"_23`*.csv)
case $newstr in
$str);;
*) echo $newstr;;
esac
g=1
sleep 13
else
newstr=$(tail -1 perf_VoMSRechargeExt_`date "+%Y_%m_%d_%H"`*.csv)
case $newstr in
$str);;
*) echo $newstr
str=$newstr;;
esac
fi
if [ $(date "+%M") -eq 01 ] && [ $(date "+%S") -lt 05 ]
then
g=0
fi
done


"Как задать последний день прошлого месяца?"
Отправлено Andrey Mitrofanov , 30-Июн-09 15:22 
1// К тому вопросу, что в теме: показать дату дня перед первым числом сего месяца:

$ date -d "`date +%Y-%m`-01 -1 day" +%F
2009-05-31
$ date +%F
2009-06-30
$ _

- без предположения, что сегодя - первое. И год тоже "переносится":

$ date -d "`date -d 2009-01-10 +%Y-%m`-01 -1 day" +%F
2008-12-31
$ _

2// По поводу "только в линуксе", на самом деле "в date из GNU coreutils".


"Как задать последний день прошлого месяца?"
Отправлено allez , 30-Июн-09 17:18 
>2// По поводу "только в линуксе", на самом деле "в date из GNU coreutils".

Я совсем не уверен в том, что вопрошающий в курсе таких тонкостей,
как существование GNU-, BSD- и прочих версий различных утилит.
Оттого и не мудрствовал лукаво, ибо GNU coreutils практически только
в Линуксе по умолчанию и устанавливаются. :-)