Вычитание дат в Unix

Вы могли рассмотреть для использования соединения SSH, совместно использующего:

Host *.some-domain
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

Вы соединяетесь только однажды со своим местом назначения и помещаете процесс ssh в фон. Затем Вы выполняете другие команды, и Вы наконец уничтожаете первый процесс.

В альтернативе можно попытаться инкапсулировать набор действий в рамках одного единственного соединения SSH.

Например, предположите, что у Вас есть каталог:

 mycommands
 |
 +- run
 +- new_data

Затем можно упаковать эти данные в tar и отправить их в сценарий:

tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run'

Теперь Вы run сценарий может получить доступ ко всем Вашим входным данным (здесь, мы имеем только new_data как в Вашем примере). Чтобы придерживаться Вашего примера, вот run сценарий:

#!/bin/sh
BASE=`dirname $0`

/etc/init.d/some_service stop
cat /var/some_service/events

mv $BASE/new_data /var/some_service/new_data
/etc/init.d/some_service start

rm -rf $BASE

Так, теперь просто необходимо сохранить events файл:

tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run' >./events

и в более общем плане у Вас может быть Ваш run сценарий производит tar и затем передает по каналу ssh в tar для распаковки его локально.

5
05.10.2013, 08:58
4 ответа

Самый легкий путь состоит в том, чтобы преобразовать дату в Unix time_t значение (т.е. секунды с начала эпохи, или '01.01.1970 0:00:00'), и затем substract 30 дней * 86 400 секунд в день от того числа.

например, следующее использование в качестве примера set -x так, чтобы Вы видели значение переменной D, когда это изменяется.

#! /bin/ksh

set -x

D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))

date -d "@$D"

Обратите внимание, что это зависит от версии GNU date, от GNU Coreutils. Другие версии даты не могут поддерживать преобразование значения time_t назад к отформатированной дате с @. Если Вы не установили GNU coreutils, это, вероятно, не доступно в Вашей системе AIX так gawk вероятно, Ваш наилучший вариант преобразовать назад в отформатированную дату:

echo "$D" | gawk '{print strftime("%c", $0)}'

мой исходный ответ здесь предложил плоскость awk, но дальнейшее тестирование в моей debian системе показало это ни один mawk ни original-awk имейте strftime встроенная функция, таким образом, необходимо будет установить или GNU Coreutils или GNU Awk.

Если жемчуг установлен в системе, жемчуг может использоваться вместо awk:

echo $D | perl -nE 'say scalar gmtime $_'

Существует несколько альтернативных методов и примеров выполнения этого в:

https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

3
27.01.2020, 20:39

Попробуйте это:

date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01

1 ноября 2012 используется для иллюстрации. Это может иметь любую дату ввода данных пользователем.

2
27.01.2020, 20:39

Ваш пример использует относительные объекты в строках даты, которые являются расширением даты GNU.

Например, на Fedora 19 Ваш пример работает как ожидалось:

$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13

Таким образом можно удостовериться, что сценарий использует дату GNU.

0
27.01.2020, 20:39

Попробуйте это.

DAY30=`TZ=EST+720 date "+%Y-%m-%d"`

print $DAY30

720 - это смещение в часах. Итак, 30 дней - это 720 часов.

EST - мой часовой пояс. Я предполагаю, что вы можете использовать любой подходящий часовой пояс.

0
27.01.2020, 20:39

Теги

Похожие вопросы