Bash:检索并比较两个日期

Bash:检索并比较两个日期

在 Bash 脚本中,我想比较两个日期,如果一个日期大于另一个日期,则执行一项任务。

我正在比较的两个日期是:

svn repo 的最后更改日期,我得到的日期信息如下:

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 转储。什么是最合适的方法?

谢谢。

答案1

/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

答案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")

你应该可以比较${_svnepoch}一下${_fileepoch}

答案3

我只需比较自纪元以来的秒数即可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

正如其他人所说,一种真正赋予日期意义的脚本语言可能更适合这类任务

相关内容