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

Mat*_*rts 2 ls shell timestamps

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

usage: ls [-1ACFHLNRabcdefgilmnopqrstuxEUX] [File...]
Run Code Online (Sandbox Code Playgroud)

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

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

Sté*_*las 11

使用ls,虽然您可能无法始终获得时间,但您应该能够推导出日期(年、月和月中的日)。

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

eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dn 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}'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

对于符号链接,您可能还想问问自己是链接的修改时间还是您所追求的目标。默认情况下,此处提到的某些选项将执行一个或另一个,并且可以告诉其中一些选项根据需要执行一个或另一个。

  • zsh统计:stat -F '%Y-%m-%d %T.%N %z' +mtime file
    1992-05-13 14:57:00.123368710 +0100
  • 格鲁statstat -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
  • 爱丽丝statstat -m file
  • 格鲁findfind file -prune -printf '%TF %TT %Tz\n'
    1992-05-13 14:57:00.1233687100 +0100
  • 格鲁datedate -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
  • 格鲁lsls --full-time -l file
    -r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
  • ast-open ls: ls -Z '%(mtime:time=%F %T.%N %z)s'
    ?1992-05-13 14:57:00.123368710 +0100

您的ls概要表明您可能正在使用的AIX有一个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
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意,很少有系统有文件的创建时间(有时也称为诞生时间),并且没有标准的API,更不用说查询它的命令,所以情况比修改时间更糟糕。