使用 stat 表示时间或日期 -r?

使用 stat 表示时间或日期 -r?

我以这种方式列出了文件夹的属性

stat -c $'--------------
File:              %n
Size:              %s
Owner:             %U
Group:             %G
Permissions:       %A'

但我在获取时间方面遇到了麻烦,如果我使用 stat 来表示时间,我会在最后得到一堆我不喜欢的数字,如果我使用 date -r ,我就不能在同一行上写任何东西在那之前就像我和其他人一样。

我希望它看起来像这样:修改时间:2019-11-13 11:34:54(末尾不带+0000)

答案1

<rant>你的stat似乎是stat. 2001 年,GNU coreutils 中出现了一个stat命令,其 API 与之前的stat实现完全不同(例如zsh1997 年的内置命令或更旧的 IRIX stat),复制了 GNU 的功能find -printf,但又使用了不同的 API(不同的%x格式说明符),当你发现一个不太有用的东西时。从那时起我就一直对此感到恼火。 (stat一年后,BSD 使用另一个(虽然更好)API 实现了自己的API)。 </咆哮>

这里,你可以使用 GNU find(这种语法比 GNU 早stat至少十年):

find ./* -prune -printf '--------------
File:              %f
Size:              %s
Owner:             %u
Group:             %g
Permissions:       %m
Modification time: %TF %8TT %Tz
'

其输出如下:

--------------
File:              file
Size:              10
Owner:             stephane
Group:             stephane
Permissions:       -rw-r--r--
Modification time: 2019-11-13 11:34:54 +0000

这里使用%F %T %z strftime()时间格式,这是时间戳的标准且明确的表示,精确到秒,您可以适应您的需要。%T<x>(其中<x>strftime()格式说明符)是最后修改时间;用于%A<x>上次访问时间、%C<x>更改状态时间。

如果您不关心%z时区偏移规范(上面),请删除它,尽管这会使时间表示不明确。%Tz

内置statzsh(再次早于 GNU 几年):

zmodload zsh/stat
for f (*) {
  stat -F '%F %T %z' -sLH s -- $f &&
    print -r -- "--------------
File:              $f
Size:              $s[size]
Owner:             $s[uid]
Group:             $s[gid]
Permissions:       $s[mode]
Modification time: $s[mtime]"
}

%z如果您不想看到时区偏移,请再次删除)。

警告说明:对于符号链接,GNU stat(不带-L)、GNU find -printf(不带-L)、 zshstat -L报告符号链接本身的修改时间,而 GNU date -r(和 GNUstat -L以及不带 的GNUfind -L -printf和 zsh )报告符号链接最终解析的文件的 mtime到。stat-L

相关内容