在 POSIX shell 中获取文件修改时间

gra*_*olf 4 shell date posix files

是否可以仅使用 POSIX 功能从 shell 获取文件修改时间?理想情况下在 unix 时间戳(秒)。

我能找到的所有东西都在使用,stat(1)但似乎没有在 POSIX 中定义。是否可以?

Sté*_*las 5

恐怕唯一的 POSIX CLI(shell 和实用程序)接口到lstat()stat()系统调用ls,它的输出不能可靠地进行后处理。

一个技巧可能是使用pax -x ustar(指定pax命令及其ustar格式)生成一个tar包含该文件的文件并从文件中提取时间戳。

echo "$((0$(pax -x ustar -wd -- "$file" |
    dd 2> /dev/null bs=4 skip=34 count=3 | tr -d '\0')))"
Run Code Online (Sandbox Code Playgroud)

mtime以八进制数的形式存储在偏移量 136 处。

但是,它受到 US-tar 格式的所有限制的阻碍。

您最好的选择是使用perlor python

perl -MPOSIX -le '
  for (@ARGV) {
    if (@s = lstat$_) {print $s[9]} else {warn "$_: $!\n"}
  }' -- "$file"
Run Code Online (Sandbox Code Playgroud)

(请注意,它不包括许多现代系统上可用的纳秒。Time::HiRes例如,您可以通过模块获取它,但前提是它已安装并且来自最新版本)。