Bash:如何使用bash减去两个时间字符串?

Ita*_*not 4 bash shell

我创建了下一个脚本以找到锁定文件的年龄:

#!/bin/bash
now=`date +"%T"`
lock="aggregator.lock"
find . -name $lock -type f
if [ $? != 0 ];
        then
        exit
else
ls -ltrh $lock 2&>/dev/null
fi
if [ $? != 0 ];
        then
        locktime=`ls -ltrh aggregator.lock |awk -F" " '{print $7}'`
else
echo "File not found"
fi
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  • 输出ls -ltrh aggregator.lock |awk -F" " '{print $7}' 给我时间格式为HH:MM而不是HH:MM:SS,输出date +"%T"给出时间格式为HH:MM:SS(根据需要),那么如何获取文件的修改时间几秒钟?
  • 我不知道如何在时间之间减去...我想做的事情就是$now - $locktime为了获得两个变量之间的秒增量,怎么做呢?

编辑:脚本的含义是找到锁文件存在多长时间...这是脚本:

device0="/home/build/aggregator/scripts/aggregator.lock"
if [ -e "$device0" ]
then
echo process is allready running
else

touch $device0
java -Xms6g  -Xmx6g -jar /home/build/aggregator/aggregator-1.0-SNAPSHOT-jar-with-dependencies.jar
rm $device0
fi
Run Code Online (Sandbox Code Playgroud)

这会创建锁文件...创建锁文件的唯一目的是让我指出脚本的运行时间有多长,只是认为需要这些信息,因为我不是在寻找自上次修改文件以来已经过了很多时间.

提前致谢

Rma*_*ano 6

要找出上次修改文件的时间,您可以使用

stat -c %Y file 
Run Code Online (Sandbox Code Playgroud)

拥有自纪元以来的最后修改日期(以秒为单位),以及

date +%s 
Run Code Online (Sandbox Code Playgroud)

对于当前日期的相同单位.然后简单地用它们减去它们$(( ... ))将给出自上次修改文件以来经过的秒数.请注意,Unix文件系统通常不存储创建日期,只存储上次访问/更改/修改日期.

要转换回人类可读的格式,请参阅/sf/answers/853985891/

所以基本上:

now=$(date +%s)                          
was=$(stat -c%Y file)      
elapsed=$((now - was))
days=$((elapsed/86400))
hours=$(( (elapsed-days*86400)/3600 ))   
mins=$(( (elapsed-days*86400 - hours*3600)/60 ))
secs=$(( elapsed - days*86400 - hours*3600 - mins*60 )) 
Run Code Online (Sandbox Code Playgroud)

现在您可以使用echoprintf根据需要格式化输出

printf '%02dd:%02dh:%02dm:%02ds\n' $days $hours $mins $secs
Run Code Online (Sandbox Code Playgroud)

将输出

00d:18h:42m:27s
Run Code Online (Sandbox Code Playgroud)

可能这种格式%02d在几天内并不合适 - 但你明白了.您也可以轻松添加周,年或其他任何内容.

要查看脚本/程序运行多长时间,您可以使用bash内置命令time或实用程序/usr/bin/time(确保不要混淆它们),或者您可以使用以下命令遵循此脚本中的想法:

was=$(date +%s)
...run your script...
now=$(date +%s) 
Run Code Online (Sandbox Code Playgroud)

并继续如上.

  • 不要将`expr`用于数学,使用`$(())`.没有人再使用`expr`,它的语法很糟糕,并且可能会导致性能问题,因为它需要一个单独的进程. (3认同)