是否可以仅使用 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 格式的所有限制的阻碍。
您最好的选择是使用perl
or 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