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

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

是否可以仅使用 POSIX 功能从 shell 获取文件修改时间?最好是 unix 时间戳(秒)。

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

答案1

恐怕唯一的 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')))"

mtime作为八进制数存储在偏移量 136 处。

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

您最好的选择是使用perlor python

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

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

答案2

如果您使用的是兼容 POSIX 的操作系统(这似乎是从您的问题中假设的),那么有一种很好的方法可以使用它pax甚至可以获得几分之一秒的时间。

称呼:

pax -xpax -wd -- "$file" | dd 2> /dev/null skip=1 count=1 |
    grep ' mtime=' | sed 's/.*mtime=//'

如果我打电话:

pax -xpax -wd -- /etc/passwd | dd 2> /dev/null skip=1 count=1 |
    grep ' mtime=' | sed 's/.*mtime=//'

我得到:

1572569707.797017689

答案3

计算起来相当简单,但这里有一个使用 python 的变体。

#-- cross-platform workaround, see https://unix.stackexchange.com/q/561927/3097
alias stat_mtime='python -c "print(__import__(\"os\").stat(__import__(\"sys\").argv[1]).st_mtime)"'

$ stat_mtime /dev/null
1624731195.3483574

相关内容