gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:54:55 24 4
gpt4 key购买 nike

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

很简单,我想要一个普遍(或至少广泛)支持的方法来获取文件的修改时间作为以秒为单位的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com