如何使用bash在文件上次修改后的几秒钟内获得时间?

mbo*_*nin 39 unix linux bash

自上次修改文件以来,我需要花费几秒钟的时间. ls -l不显示它.

Sto*_*ica 76

GNU实现date有一个-r选项来打印文件的最后修改日期而不是当前日期.我们可以使用格式说明符%s来获取以秒为单位的时间,这样便于计算时差.

lastModificationSeconds=$(date +%s -r file.txt)
currentSeconds=$(date +%s)
Run Code Online (Sandbox Code Playgroud)

然后您可以使用算术上下文来计算差异,例如:

((elapsedSeconds = currentSeconds - lastModificationSeconds))
# or
elapsedSeconds=$((currentSeconds - lastModificationSeconds))
Run Code Online (Sandbox Code Playgroud)

您还可以在没有临时变量的情况下直接计算和打印经过的秒数:

echo $(($(date +%s) - $(date +%s -r file.txt)))
Run Code Online (Sandbox Code Playgroud)

不幸的是,BSD的实现date(例如在Mac OS X中)不支持该-r标志.要获得最后一次修改秒数,您可以使用该stat命令,而不是其他建议的答案.完成后,其余步骤与计算经过的秒数相同.

  • 如果您将格式部分作为最后一个参数移动,它也适用于 macs(至少适用于 sierra)。`date -r file.txt +%s` 和 `echo $(($(date +%s) - $(date -r file.txt +%s)))` (4认同)
  • MacOS 支持 `date -r`,只要您按以下顺序使用它即可:`date -r file.txt +%s` (3认同)

Jas*_*chs 8

在 BASH 中,自上次修改以来使用它几秒钟:

 expr `date +%s` - `stat -c %Y /home/user/my_file`
Run Code Online (Sandbox Code Playgroud)


ber*_*roe 8

我知道标签是Linux,但stat -c语法在OSX上对我不起作用.这确实有效......

echo $(( $(date +%s) - $(stat -f%c myfile.txt) ))
Run Code Online (Sandbox Code Playgroud)

并且作为使用文件名调用的函数:

lastmod(){
     echo "Last modified" $(( $(date +%s) - $(stat -f%c "$1") )) "seconds ago"
}
Run Code Online (Sandbox Code Playgroud)

  • 也许以前可以在 OS X 下工作,但现在 `-f%c` 会出错。使用 `stat -c%Y "$1"` 有效。 (2认同)
  • 至少在 sierra 上,“linux”方式本来可以正常工作,但它只是不喜欢参数的排序。它只接受格式作为最后一个参数。所以`date -r file.txt +%s` 对我有用,它似乎也适用于某些 linux,但显然它不是 POSIX,所以可移植性是可疑的。 (2认同)