【问题标题】:How to get time since file was last modified in seconds with bash?如何获取自上次使用 bash 修改文件以来的时间(以秒为单位)?
【发布时间】:2013-10-28 02:30:11
【问题描述】:

我需要获取自上次修改文件以来的时间(以秒为单位)。 ls -l 没有显示。

【问题讨论】:

    标签: linux bash unix


    【解决方案1】:

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

    lastModificationSeconds=$(date +%s -r file.txt)
    currentSeconds=$(date +%s)
    

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

    ((elapsedSeconds = currentSeconds - lastModificationSeconds))
    # or
    elapsedSeconds=$((currentSeconds - lastModificationSeconds))
    

    您也可以直接计算和打印经过的秒数,无需临时变量:

    echo $(($(date +%s) - $(date +%s -r file.txt)))
    

    不幸的是,date 的 BSD 实现(例如在 Mac OS X 中)不支持 -r 标志。要获得最后修改秒数,您可以改用 stat 命令,正如其他答案所建议的那样。 一旦你有了它,剩下的过程就是计算经过的秒数。

    【讨论】:

    • 如果你想以毫秒为单位:$(($(date +'%s%N' -r file.txt)/1000000))
    • 如果将格式部分作为最后一个参数移动,它也适用于 mac(至少适用于 sierra)。 date -r file.txt +%secho $(($(date +%s) - $(date -r file.txt +%s)))
    • 对于包含多个文件的文件夹和子文件夹,请将此与 stackoverflow.com/a/23034261/1707015 结合使用——太棒了:D
    • MacOS 支持date -r,只要你按照这个顺序使用:date -r file.txt +%s
    【解决方案2】:

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

    echo $(( $(date +%s) - $(stat -f%c myfile.txt) ))
    

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

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

    【讨论】:

    • 也许这曾经在 OS X 下工作,但现在 -f%c 给出了一个错误。使用stat -c%Y "$1" 有效。
    • @BrentFoust 仍然适用于 10.10.5(而 -c%Y 不适用)。你在 El Capitan 上吗?
    • 至少在 sierra 上,"linux" 方式可以正常工作,但它只是不喜欢参数的顺序。它只接受格式作为最后一个参数。所以date -r file.txt +%s 对我有用,它似乎也适用于某些 linux,但显然它不是 POSIX,所以可移植性是可疑的..
    【解决方案3】:

    在 BASH 中,使用自上次修改后的秒数:

     expr `date +%s` - `stat -c %Y /home/user/my_file`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2013-09-29
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      相关资源
      最近更新 更多