Bash: Recuperando e comparando duas datas

2

No script Bash, gostaria de comparar duas datas e, se uma for maior que a outra, executar uma tarefa.

Duas datas que estou comparando são:

a última data de alteração do svn repo, recebo as informações de data da seguinte forma:

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

Isso me dá algo assim:

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

Então, estou encontrando as informações de data do arquivo de backup mais atual no diretório, assim:

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

(Eu me pergunto se há uma maneira melhor de fazer isso com a cabeça e a cauda acima)

O que me dá algo assim:

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

O que eu gostaria de fazer a seguir é recuperar a data da primeira saída e compará-la com a segunda data de saída e, se uma for maior que a outra, farei um svn dump. qual seria a maneira mais apropriada de fazer isso?

Obrigado.

    
por user80666 09.06.2011 / 14:06

3 respostas

4

/ bin / date pode converter a hora em formatos, incluindo segundos da época.

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
    
por 09.06.2011 / 14:34
2
## 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")

Você deve poder comparar ${_svnepoch} e ${_fileepoch} agora

    
por 09.06.2011 / 14:34
0

Eu simplesmente compararia o número de segundos desde a época ls -lt --time-style="+%s" . Isso te dá um bom número que você pode comparar.

De 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.

Fácil o suficiente para fazer.

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

Como outros postaram, uma linguagem de script que realmente dá sentido a uma data provavelmente é mais adequada para esse tipo de tarefa

    
por 09.06.2011 / 14:42

Tags