如何在shell脚本中获取修改日期和当前日期之间的差异?

如何在shell脚本中获取修改日期和当前日期之间的差异?
#!/bin/bash
echo "hi"
path="/home/alert/VideoApplicationAPI.v1/logs"
dayDiff=365

DATE=`date +%Y-%m-%d`
for filename in $path/*.*; do
    modDate=$(stat -c %y  "$filename") 
    #modDate=$(date -r   "$filename"+%s) 
    modDate=${modDate%%  *}
    echo $filename:$modDate

    #lastUpdate=$(stat -c %y "$filename")
    now="$(date +%s)"
    diff="${now}-${lastUpdate}"
done

echo $DATE 

答案1

这接近于转发这个问题。根据您的格式调整他们的脚本为我们提供了这组命令:

echo "$(( $(date -d "$d2" +%s) - $(date -d "$d1" +%s) )) / 86400" | bc -l

其中 $d1 是较小的(较早的日期),$d2 是较大的(较晚的)日期。

所以,据我所知,这应该可以解决问题:

echo "$(( $(date -d "$modDate" +%s) - $(date -d "$now" +%s) )) / 86400" | bc -l

澄清,

bc -l

根据其手册页,

...一种支持任意精度数字并交互式执行语句的语言。语法与 C 编程语言有一些相似之处。

它允许您在答案中获取十进制数字,因为大多数 shell 仅支持整数除法。

答案2

我不确定你想在这里修改什么,据我所知,stat -c仅适用于 GNU stat,并stat -c %y以 格式给出输出2019-03-14 14:21:32.704211521 +0200。您试图删除两个空格后的任何内容,但没有。


无论如何,如果您想对时间戳进行算术,最好将其视为自纪元以来的秒数,即-c %Y,而不是-c %y。然后,要获得差异(以秒为单位),您可以$(( .. ))在 shell 中使用算术扩展:

$ diff=$(( "$(date +%s)" - "$(stat -c %Y "$file")" ))
$ echo $diff
86527

为了得到小时、分钟和秒,只需进行适当的除法并取余数:

$ s=$(( diff % 60 )); m=$(( diff / 60 % 60 )); h=$(( diff / 3600 ))
$ printf "%d:%02d:%02d\n" "$h" "$m" "$s"
24:02:07

或者使用egbc来获取小数天的时间,如@Pheri的回答显示。

相关内容