以秒为单位获取文件修改时间的最佳方法

问题描述 投票:8回答:3

这似乎是各种平台上非标准功能的经典案例。

非常简单,我想要一种普遍(或至少广泛使用)的方法来获取文件的修改时间,以秒为单位的unix时间戳。

现在,我知道使用stat的各种方法,但是大多数都是特定于平台的;例如stat -c %Y $file适用于某些计算机,但不适用于OS X(可能还有其他FreeBSD系统),而OS X则使用stat -f %m $file

同样,某些平台支持date -r $file +%s,但是OS X / FreeBSD再次不支持,因为-r选项似乎只是使用+%s获取unix时间戳的替代方法,而不是使用参考文件选项其他平台。

我熟悉的另一种选择是将find-printf选项一起使用,但是同样,这种方法并未得到广泛支持。我知道的最后一种方法是解析ls,除了要做一件不愉快的事情外,我也不相信(或至少应该)依赖它。

因此,是否有更兼容的方法来获取文件的修改时间?目前,我只是将stat的不同版本放入脚本中并运行它们直到状态为0的一个退出为止,但这并不理想,即使我缓存成功的命令以后再运行。

shell date compatibility
3个回答
7
投票

因为似乎没有找到一个“正确的”解决方案,所以我想将当前的解决方案进行比较:

if stat -c %Y . >/dev/null 2>&1; then
    get_modified_time() { stat -c %Y "$1" 2>/dev/null; }
elif stat -f %m . >/dev/null 2>&1; then
    get_modified_time() { stat -f %m "$1" 2>/dev/null; }
elif date -r . +%s >/dev/null 2>&1; then
    get_modified_time() { stat -r "$1" +%s 2>/dev/null; }
else
    echo 'get_modified_time() is unsupported' >&2
    get_modified_time() { printf '%s' 0; }
fi

[编辑]我正在对此进行更新,以反映我使用的代码的最新版本,基本上,它会尝试尝试两个主要的stat方法和某种通用的date方法,以尝试获取当前工作目录的修改时间。 ,如果其中一种方法成功,它将创建一个封装该函数的函数,以供稍后在脚本中使用。

此方法与我之前发布的方法不同,因为即使从未调用get_modified_time,它也总是进行一些处理,但是,如果您确实需要在大多数时间调用它,则总体上它会更有效。它还使您可以较早地捕获不受支持的平台。

如果您希望只在调用时测试功能的函数,则为另一种形式:

get_modified_time() {
    modified_time=$(stat -c %Y "$1" 2> /dev/null)
    if [ "$?" -ne 0 ]; then
        modified_time=$(stat -f %m "$1" 2> /dev/null)
        if [ "$?" -ne 0 ]; then
            modified_time=$(date -r "$1" +%s 2> /dev/null)
            [ "$?" -ne 0 ] && modified_time=0
        fi
    fi
    echo "$modified_time"
}

0
投票

只需向操作系统询问其名称,然后从那里开始。或者,编写C程序,或使用Python或其他更常见且更标准化的工具:How to get file creation & modification date/times in Python?


0
投票

为什么这么复杂?

在网上找不到东西后,我只是阅读了ls的手册

man ls

给了我]

ls --time-style=full-iso -l

并以hh:mm:ss.sssssssss格式更改时间作为

ls --time-style=+FORMAT -l

FORMAT与日期一起使用(请参阅man date

ls --time-style=+%c

将为您提供本地日期和时间,以秒为整数(不带小数点)。当您通过awk传递管道时,可以删除其他ls信息(例如文件名,所有者...)。

© www.soinside.com 2019 - 2024. All rights reserved.