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

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

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

现在我知道使用stat进行此操作的各种方法,但大多数都是特定于平台的;例如,stat -c%Y $文件适用于某些文件,但不适用于使用stat -f%m $文件的OS X(以及可能是其他FreeBSD系统).

同样,某些平台支持date -r $file%s,但是OS X / FreeBSD再次没有,因为-r选项似乎只是使用%s获取unix时间戳的替代选项,而不是像以前那样使用引用文件选项其他平台.

我熟悉的另一个替代方法是使用带-printf选项的find,但是这并没有被广泛支持.我所知道的最后一种方法是解析ls,除了是一件令人不快的事情之外,我认为不能(或者至少应该)依赖它.

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

由于似乎可能没有“正确”的解决方案,我想我会发布我当前的一个用于比较:
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方法一个有点常见的日期方法,任何尝试获得当前工作目录的修改时间,如果有如果方法成功,它会创建一个封装它的函数,以便稍后在脚本中使用.

这个方法与我之前发布的方法有所不同,因为它总是进行一些处理,即使从未调用过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"
}

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...