完整文件日期(沒有 GNU 實用程序)
我正在嘗試獲取特定文件的完整日期(創建或修改)以傳遞給另一個程序。我嘗試了 ls 命令的選項變體,但沒有一個為小於 6 個月的文件提供完整日期,並且我限制了這些選項的使用。當我嘗試某些選項時,我看到嘗試對此進行研究,我收到以下消息:
usage: ls [-1ACFHLNRabcdefgilmnopqrstuxEUX] [File...]
據我所知,這些似乎都不能提供我需要的東西,所以我嘗試使用 stat 命令,但它對我不可用。
我在 AIX 5.3 上使用 Korn shell,它具有有限的可用命令,任何人都可以提出另一種方法,我可以獲取文件的創建或修改日期作為完整日期(dd/mm/yyyy 或 yyyy/mm/dd )。
使用
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}'
現在,如果你想要最精確的完整修改時間,恐怕沒有標準的命令。
您會發現一些
ls
具有該選項的實現(例如ls --full-time
使用 GNUls
或-D <format>
使用 FreeBSDls
)存在許多不同且不兼容的
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
- 愛麗絲
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
- 自由BSD
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
您的
ls
概要表明您可能正在使用的 AIX 有一個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,更不用說查詢它的命令,因此情況比修改時間還要糟糕。