На удалённом сервере каждый час создаётся новый файл, который именуется так - 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, вычитания единицы?
если сегодня 1-е то можно использовать
date -d yesterday +%d
вообще вся задача решается с помощью добавления к date параметра:
-d "-1 hour"
>Как задать предидущий день, час, не по средствам функции expr, вычитания единицы?А какая ОС на сервере установлена? Если Linux, то приведенные выше советы сработают,
если же что-то другое - то очень даже могут и не сработать.P. S. Сообщать о том, какая ОС используется - элементарное правило хорошего тона. ;-)
>А какая ОС на сервере установлена? Если 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
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".
>2// По поводу "только в линуксе", на самом деле "в date из GNU coreutils".Я совсем не уверен в том, что вопрошающий в курсе таких тонкостей,
как существование GNU-, BSD- и прочих версий различных утилит.
Оттого и не мудрствовал лукаво, ибо GNU coreutils практически только
в Линуксе по умолчанию и устанавливаются. :-)