You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在POSIX sh中获取文件的UNIX纳秒级最后修改时间?

POSIX标准下获取文件最后修改时间(纳秒级UNIX时间戳)

你提到的两种方法都是GNU工具链的扩展,不符合POSIX标准——stat -c是GNU stat专属选项,date -r则是GNU date的非标准参数,且前者只能输出秒级精度。

要在POSIX标准下实现纳秒级UNIX时间戳(秒数+纳秒数拼接,方便数值比较),可以利用POSIX规范的stat命令能力:

POSIX标准的stat支持通过-f指定输出格式,其中:

  • %m:输出文件最后修改时间的秒级UNIX时间戳(自Epoch起的秒数)
  • %Sm:输出带纳秒精度的修改时间字符串,格式为YYYY-MM-DD HH:MM:SS.fffffffff(小数点后固定9位纳秒)

基于这两个格式符,可以通过一行命令直接拼接出纳秒级时间戳:

stat -f "%m %Sm" "$1" | awk -F'[ .]' '{print $1$3}'

命令解释:

  1. stat -f "%m %Sm" "$1":输出两部分内容,第一是秒级时间戳,第二是带纳秒的完整时间字符串,用空格分隔
  2. awk -F'[ .]' '{print $1$3}':以空格和小数点作为分隔符,取第一个字段(秒数)和第三个字段(9位纳秒数),拼接后输出

如果需要分步执行(便于理解或调试),可以拆成:

# 获取秒级时间戳
timestamp_sec=$(stat -f "%m" "$1")
# 提取纳秒部分(从带纳秒的时间字符串中截取小数点后9位)
timestamp_nsec=$(stat -f "%Sm" "$1" | awk -F. '{print $2}')
# 拼接成纳秒级时间戳
echo "${timestamp_sec}${timestamp_nsec}"

注意事项:

  • POSIX规范中%Sm的纳秒部分固定为9位,即使实际纳秒不足也会补0,因此拼接后的结果是18位数字(秒数通常是10位+9位纳秒),可以直接用于数值比较
  • 该方法完全符合POSIX.1-2017标准,可在任何遵循POSIX的系统(如FreeBSD、Solaris、AIX等)上运行,无需依赖GNU工具

内容的提问来源于stack exchange,提问作者Coarse Rosinflower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 11:42:35