这似乎是各种平台上非标准功能的经典案例。
很简单,我想要一个普遍(或至少广泛)支持的方法来获取文件的修改时间作为以秒为单位的 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/