完整文件日期(不含 GNU 实用程序)

完整文件日期(不含 GNU 实用程序)

我正在尝试获取特定文件的完整日期(创建或修改)以传递给另一个程序。我已经尝试使用 ls 命令使用各种选项,但没有一个提供小于 6 个月的文件的完整日期,而且我对这些选项的使用有限制。当我尝试某些选项时,我看到试图研究这个问题,我收到以下消息:

usage: ls [-1ACFHLNRabcdefgilmnopqrstuxEUX] [File...]

据我所知,这些似乎都不能提供我需要的东西,所以我尝试使用 stat 命令,但它对我来说不可用。

我在 AIX 5.3 上使用 Korn shell,它的可用命令有限,任何人都可以建议另一种方式,让我能够获取文件的创建或修改日期作为完整日期(dd/mm/yyyy 或 yyyy/mm/dd) )。

答案1

ls,尽管您可能并不总是能够获得时间,你应该能够推导出日期(年、月、日)。

在 C 语言环境中, 中 的日期输出ls -l应该Mmm dd HH:MM针对最近的文件(并且您应该能够导出年份(今年或上一年)或Mmm dd YYYY针对较旧的文件或具有未来修改时间的文件。因此您应该总是能够从中获取日期(YYYY-mm-dd):

eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dln file | awk -v y="$year" -v m="$month" '{
  month = index("--JanFebMarAprMayJunJulAugSepOctNovDec", $6) / 3
  day = $7
  if ($8 ~ /:/)
    year = y - (month > m)
  else
    year = $8
  printf "%04d-%02d-%02d\n", year, month, day
  exit}'

现在,如果您想要最高精度的完整修改时间,恐怕没有标准命令。

您会发现一些ls具有相应选项的实现(例如ls --full-time使用 GNUls-D <format>FreeBSD )ls

存在许多不同且不兼容的stat命令实现(IRIX、zsh内置、GNU、BSD)可以为您提供该功能。

或者您可以使用-printfGNU 谓词find。或者-rGNU 的选项date

并非所有实现都会为您提供亚秒级粒度。请注意时区和 DST,因为根据您选择的格式和您所在的时区,给定的输出可能不明确,并且引用多个可能的日期。

对于符号链接,您可能还想问自己这是否是链接的修改时间或其目标。这里提到的一些选项默认会执行其中之一,并且可以根据需要告诉其中一些选项执行其中之一。

  • zsh统计:stat -F '%Y-%m-%d %T.%N %z' +mtime file
    1992-05-13 14:57:00.123368710 +0100
  • GNU stat: stat -c %y file
    1992-05-13 14:57:00.123368710 +0100
  • BSD statstat -t '%F %T %z' -f %Sm file
    1992-05-13 14:57:00 +0100
  • IRIX statstat -m file
  • GNU find: find file -prune -printf '%TF %TT %Tz\n'
    1992-05-13 14:57:00.1233687100 +0100
  • GNU date: date -r file '+%F %T.%N %z'
    1992-05-13 14:57:00.123368710 +0100
  • FreeBSD ls: ls -D '[%F %T %z]' -l file
    -r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file
  • GNU ls: ls --full-time -l file
    -r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
  • ast 打开ls: ls -Z '%(mtime:time=%F %T.%N %z)s'
    1992-05-13 14:57:00.123368710 +0100

AIX,您的ls概要表明您可能正在使用它,它有一个istat命令 (AIX 5.3 手册页),完整显示日期(没有亚秒级粒度,除非强制,否则是不明确的TZUTC0,但解析起来并不容易:

$ LC_ALL=C TZ=UTC0 istat file
Inode 10360 on device 10/6    File
Protection: r-xr-xr-x
Owner: 2(bin)     Group: 2(bin)
Link count: 2     Length 372298 bytes

Last updated:  Wed May 13 14:08:13 1992
Last modified: Wed May 13 13:57:00 1992
Last accessed: Sun Jan 31 15:49:23 1993

另请注意,对于符号链接,您将获得符号链接目标的日期,而不是符号链接本身。

如果您无法访问其中任何一个,那么可移植性的最佳选择可能是perl

$ perl -MPOSIX -le 'print strftime("%Y-%m-%d %T %z", localtime((lstat(shift))[9]))' file
1992-05-13 14:57:00 +0100

请注意,很少有系统具有创建时间对于文件(有时称为出生时间),而且没有标准的API,更不用说查询命令了,所以情况比修改时间还要糟糕。

答案2

如果你有 GNU ls

ls --time-style=long-iso -l

或者

ls --time-style=+FMT -l

其中 FMT 遵循date命令格式。在你的情况下:

ls --time-style=+%Y/%m/%d -l

答案3

这是一个 POSIX 函数来执行此操作:

mtime() {
   touch -r "$1" /etc/fstab
   diff -u /etc/fstab /dev/null | head -n 1 | cut -f 2
}

结果:

$ mtime ~/.profile
2019-07-01 06:25:34.000000000 -0500

http://cup.github.io/autumn/util/path/file-mtime

相关内容