9

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

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

现在我知道有多种方法可以做到这一点,stat但大多数都是特定于平台的;例如stat -c %Y $file,适用于某些人,但不适用于 OS X(可能还有其他 FreeBSD 系统),而后者则使用它stat -f %m $file

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

我熟悉的另一种选择是使用find-printf选项,但同样没有得到广泛支持。我知道的最后一种方法是解析ls,除了是一件令人不快的事情之外,我认为也不是可以(或至少应该)依赖的东西。

那么,是否有更兼容的方法来获取文件的修改时间?目前,我只是将不同的变体stat放入脚本中并运行它们,直到一个以零状态退出,但这远非理想,即使我缓存了成功的命令以在将来首先运行。

4

3 回答 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() { date -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"
}
于 2013-07-28T10:10:07.320 回答
1

为什么这么复杂?

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

man ls

这给了我

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

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

ls --time-style=+FORMAT -l

whileFORMAT与 date 一样使用(请参阅man date

ls --time-style=+%c

将为您提供本地日期和时间,以秒为整数(不带小数点)。当您通过awk.

于 2019-10-17T01:45:27.413 回答
0

只需询问操作系统的名称,然后从那里开始。或者,编写一个 C 程序,或使用 Python 或其他非常常见且更标准化的东西:如何在 Python 中获取文件创建和修改日期/时间?

于 2013-07-27T09:06:30.263 回答