我正在尝试获取特定文件的完整日期(创建或修改)以传递给另一个程序。我已经尝试使用 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)可以为您提供该功能。
或者您可以使用-printf
GNU 谓词find
。或者-r
GNU 的选项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
stat
:stat -t '%F %T %z' -f %Sm file
↳1992-05-13 14:57:00 +0100
- IRIX
stat
:stat -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 手册页),完整显示日期(没有亚秒级粒度,除非强制,否则是不明确的TZ
)UTC0
,但解析起来并不容易:
$ 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