graywolf Asked: 2020-01-14 12:32:30 +0800 CST2020-01-14 12:32:30 +0800 CST 2020-01-14 12:32:30 +0800 CST 在 POSIX shell 中获取文件修改时间 772 是否可以仅使用 POSIX 功能从 shell 获取文件修改时间?理想情况下在 unix 时间戳(秒)中。 我能找到的所有东西都在使用stat(1),但在 POSIX 中似乎没有定义。可能吗? shell files 3 个回答 Voted Best Answer Stéphane Chazelas 2020-01-14T12:53:07+08:002020-01-14T12:53:07+08:00 恐怕唯一的 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模块获取它,但假设它已安装并且来自最新版本)。 schily 2020-01-15T05:38:53+08:002020-01-15T05:38:53+08:00 如果您使用的是符合 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 ulidtko 2021-07-02T03:52:13+08:002021-07-02T03:52:13+08:00 解决起来相当简单,但这里有一个使用 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
恐怕唯一的 POSIX CLI(shell 和实用程序)接口
lstat()
和stat()
系统调用是它的输出不能可靠地进行后处理。ls
一个技巧可能是使用
pax -x ustar
(指定pax
命令及其ustar
格式)生成一个tar
包含文件的文件并从文件中提取时间戳。以
mtime
八进制数存储在偏移量 136 处。但是,它受到 US-tar 格式的所有限制的阻碍。
您最好的便携选择是使用
perl
orpython
:(请注意,它不包括许多现代系统上可用的纳秒。例如,您可以通过
Time::HiRes
模块获取它,但假设它已安装并且来自最新版本)。如果您使用的是符合 POSIX 的操作系统(这似乎是从您的问题中假设的),那么有一种很好的方法可以做到这一点
pax
,它甚至可以得到几分之一秒。称呼:
如果我打电话:
我得到:
解决起来相当简单,但这里有一个使用 python 的变体。