Shell

完整文件日期(沒有 GNU 實用程序)

  • January 14, 2020

我正在嘗試獲取特定文件的完整日期(創建或修改)以傳遞給另一個程序。我嘗試了 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>使用 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 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
  • GNU findfind file -prune -printf '%TF %TT %Tz\n'

1992-05-13 14:57:00.1233687100 +0100

  • GNU datedate -r file '+%F %T.%N %z'

1992-05-13 14:57:00.123368710 +0100

  • 自由BSD lsls -D '[%F %T %z]' -l file

-r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file

  • GNU lsls --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,更不用說查詢它的命令,因此情況比修改時間還要糟糕。

引用自:https://unix.stackexchange.com/questions/255524