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

标签 shell date compatibility

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

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

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

同样,一些平台支持 date -r $file +%s ,然而 OS X/FreeBSD 又不像 -r选项似乎只是使用 +%s 的替代方法用于获取 unix 时间戳,而不是其他平台上的引用文件选项。

我熟悉的另一种选择是使用 find-printf选项,但这同样没有得到广泛支持。我知道的最后一种方法是解析 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() { date -r "$1" +%s 2>/dev/null; }
else
    echo 'get_modified_time() is unsupported' >&2
    get_modified_time() { printf '%s' 0; }
fi

[编辑]
我正在更新它以反射(reflect)我使用的代码的最新版本,基本上它测试了两个主要 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"
}

关于shell - 以秒为单位获取文件修改时间的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17878684/

相关文章:

linux - 某些环境变量在某些情况下不会加载

python - 支持不同版本的Python

html - 哪些浏览器支持 HTML5 History API?

perl - 重命名命令中的下划线(Perl 和 Unix shell)

linux - 检查每个项目是路径中的文件还是目录的程序

MySQL DATE_ADD() 来自另一个表的周期

mysql - 在MySQL中存储数据以供按日期范围查询

android - 从兼容性 fragment 添加/更改兼容性 SimpleMenu/MenuItem

bash - 我将/etc/passwd 更改为 git-shell 并将其改回,但现在 shell 无法正常工作

java - 在 XStream 中将日期字段格式化为字符串