如何在bash脚本中比较两个日期?

如何在bash脚本中比较两个日期?

我正在尝试将今天的日期与文件中的最后修改日期进行比较。

DATE=$(date +"%F")

LASTMOD=$(stat $i -c %y);
LASTMOD_DATE=$(cut -d' ' -f1 <<<"$LASTMOD")

if [ "$LASTMOD_DATE" -ge "$DATE" ]; then
    printf "%-19s | " "$DATE"
else
    printf "%-19s | " "NO RECENT MOD"
fi

目前,这无法正确比较它们,我认为这是因为 LASTMOD_DATE 实际上不是日期时间,所以我收到错误:“需要整数表达式”。

答案1

您可以使用时间戳格式date +%s-r选项。

-r, --reference=FILE
         display the last modification time of FILE

喜欢

if [ $(date +%s -r file) -ge $(date +%s) ]; then 
    # do something
fi

答案2

比较时间点(日期)的最佳方法是以秒为单位(自纪元以来)。

%y将stat更改%Y为 将会给出文件的修改日期(以秒为单位):

fileModifiedOn=$(stat $i -c %Y)

今天的日期可以使用格式为 %s 的 (GNU) 日期读取:

todayDate=$(date +'%s')

或者,在 Bash 5.0 中,使用变量EPOCHSECONDS

todayDate=$EPOCHSECONDS

或者,在旧版 bash 中,使用(内置)printf 格式:

todayDate=$(printf '%(%s)T')

那么,这只是一个简单的整数比较的问题:

if [[ "$fileModifiedOn" -gt "$todayDate" ]] then
    result=$todayDate
else
    result="NO RECENT MOD"
fi

printf "%-19s | " "$result"

相关内容