Назад | Перейти на главную страницу

Bash: получение и сравнение двух дат

В сценарии Bash я хотел бы сравнить две даты, и, если одна больше другой, выполнить задачу.

Я сравниваю две даты:

Дата последнего изменения репозитория svn, я получаю такую ​​информацию о дате:

svn info svn://server.com/reponame -r 'HEAD' | grep 'Last Changed Date'

Это дает мне что-то вроде этого:

Last Changed Date: 2011-06-06 22:26:50 -0400 (Mon, 06 Jun 2011)

Затем я нахожу информацию о дате самого последнего файла резервной копии в каталоге, например:

ls -lt --time-style="+%Y-%m-%d %H:%M:%S" | head -n 2 | tail -n 1

(Интересно, есть ли лучший способ сделать это без головы и хвоста выше)

Это дает мне что-то вроде этого:

-rw-r--r-- 1 user1 user1 14 2011-06-09 07:52:50 svn.dump

Что я хотел бы сделать дальше, так это получить дату из первого вывода и сравнить ее со второй датой вывода, и если одна из них больше другой, я сделаю дамп svn. что было бы наиболее подходящим способом сделать это?

Спасибо.

/ bin / date может преобразовывать время в форматы, включая секунды от эпохи.

DATE_1="`svn info svn://server.com/reponame -r 'HEAD' | grep 'Last Changed Date' | grep -E -o \"[0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}\"`"

DATE_2="`ls -lt --time-style="+%Y-%m-%d %H:%M:%S" | head -n 2 | tail -n 1 | grep -E -o \"[0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}\"`"

if [ "`date --date \"$DATE_1\" +%s`" -gt "`date --date \"$DATE_2\" +%s`" ]; then
    echo "Greater"
else
    echo "Less or equal"
fi
## Specify the filename to dump here
_filename = svn.dump

## Grab the mtime of the file and print out in "seconds since Epoch format"
_fileepoch=$(find ${_filename} -printf "%Ts")

## Grab the last changed date of the file and store it in _svndate
_svndate=$(svn info svn://server.com/reponame -r 'HEAD' \
              | grep 'Last Changed Date' \
              | awk '{print $4, $5, $6}')

## Use date --date with the "%s" format specifier to print seconds since Epoch
## for that date
_svnepoch=$(date --date "${_svndate}" "+%s")

Вы сможете сравнить ${_svnepoch} и ${_fileepoch} сейчас

Я бы просто сравнил количество секунд с эпохи ls -lt --time-style="+%s". Это хороший показатель, с которым можно сравнивать.

Из man bash

   arg1 OP arg2
          OP  is  one  of -eq, -ne, -lt, -le, -gt, or -ge.
          These arithmetic binary operators return true if
          arg1 is equal to, not equal to, less than, less
          than or equal to, greater than, or greater than or
          equal to arg2, respectively.  Arg1 and arg2 may be
          positive or negative integers.

Достаточно легко сделать.

F1=$(ls -l --time-style='+%s' file1|awk '{ print $6 }')
F2=$(ls -l --time-style='+%s' file2|awk '{ print $6 }')
if [ $F1 -gt $F2 ]; then
    echo yay
    echo F1: $F1
else
    echo nay
    echo F2: $F2
fi

Как писали другие, язык сценариев, который действительно придает значение дате, вероятно, лучше подходит для такого рода задач.