我用来stat -f %m .bashrc
获取 osx 上 .bashrc 的修改时间。但是当我在 ubuntu 上运行相同的命令时,它会出现错误:
stat: cannot read file system information for %m': No such file or directory
有没有兼容的方法来实现这一目标?
答案1
Ubuntu 使用 GNU coreutils stat
,而 OSX 使用 BSD 变体。所以在 Ubuntu 上命令有点不同:
stat -c %Y .bashrc
从man stat
:
-c --format=FORMAT use the specified FORMAT instead of the default; output a new‐ line after each use of FORMAT
和:
%Y time of last data modification, seconds since Epoch
如果您想要一种可移植的方式来运行它们,而不管操作系统如何,那么有几种方法可以实现。我想我会一次将一个变量设置为适当的参数:
if uname | grep -q "Darwin"; then
mod_time_fmt="-f %m"
else
mod_time_fmt="-c %Y"
fi
然后在stat
命令中需要的地方使用该值:
stat $mod_time_fmt .bashrc
答案2
这取决于你所说的“这个”是什么意思。如果您询问是否有一种可移植的方式来获取文件mtime
,stat(1)
那么不,没有。 BSDstat(1)
与 Linux 不同stat(1)
。
如果您询问是否有一种可移植的方式来获取文件的mtime
,那么是的,您可以使用以下方法来做到这一点perl(1)
:
perl -e 'print +(stat $ARGV[0])[9], "\n"' file
答案3
由于 OSX 和 Ubuntu 版本stat
有一些差异,OSXstat
默认为简洁输出,而 Linuxstat
默认为详细输出,因此需要跳过一些障碍。一种可能性是在 OSX 上简单地使用别名,使 stat 在两者上执行相同的操作。
如果您不介意设置别名来强制stat
在 OSX 上进行详细输出,alias stat="stat -x"
那么您就不需要 perl。
stat .bashrc| grep Modify
这就是 Ubuntu 下你所需要的一切。如果您按照上面的方式设置别名,它将在以下情况下工作操作系统也一样
Ubuntu 14.04.5 的示例 从 Ubuntu 16.04 可以获得几乎相同的结果
stat .bashrc| grep Modify
Modify: 2014-03-30 23:14:47.658210121 -0500
如果您想要的只是时间戳,您可以剥离Modify:
并保留其余部分
stat .bashrc| grep Modify | cut -c 9-
资料来源: