关于时区

关于时区

我想获取特定格式的文件的修改时间。
我怎样才能做到这一点 ?
我知道关于

stat -c %x find.txt

但我需要这种格式:

yyyymmddhh24miss

如果重要的话我正在使用kshLinux 2.6.18-406.el5 x86_64

答案1

使用 GNU 工具:

find file -prune -printf '%TY%Tm%Td%TH%TM%TS\n'

或者

date -r file +%Y%m%d%H%M%S.%N

(但请注意,对于符号链接,它显示了修改时间目标符号链接的时间,而不是符号链接本身(这可能就像谁关心符号链接的运行时间一样,请参阅-Lfind同样的事情))。

如果您kshksh93并且它是在date启用内置功能的情况下构建的:

command /opt/ast/bin/date -m -f %Y%m%d%H%M%S.%N file

command /opt/ast/bin/date调用date绑定到 的内置函数/opt/ast/bin/date,如果您/opt/ast/bin在 前面添加$PATH,那么当您通过名称调用它们时,这些内置函数将被自动调用)。

如果您不关心小数部分,请删除.%Nfind,替换%TS%.2TS

请注意,时间将以当前时区给出。由于此日期格式不包含 UTC 偏移量,因此可能不明确。例如在我的英国大陆时区:

$ date -r file1
Sun 30 Oct 01:00:00 BST 2016
$ date -r file2
Sun 30 Oct 01:00:00 GMT 2016

这两个文件的修改时间相隔 3600 秒,一个在更改为冬季时间之前,一个在更改为冬季时间之后,但仍然处于相同的挂钟时间(因为该时钟已在时间间隔内向后移动一小时)。

$ find file? -prune -printf '%TY%Tm%Td%TH%TM%TS\n'
20161030010000.0000000000
20161030010000.0000000000

为了获得明确的时间,您可以包含 UTC 偏移量:

$ find file? -prune -printf '%TY%Tm%Td%TH%TM%TS%Tz\n'
20161030010000.0000000000+0100
20161030010000.0000000000+0000

或者给出 UTC 时间:

$ TZ=UTC0 find file? -prune -printf '%TY%Tm%Td%TH%TM%TS\n'
20161030000000.0000000000
20161030010000.0000000000

答案2

你可以使用类似的东西:

/bin/date +%Y%m%d%H%M%S -d "$(/usr/bin/stat -c %x find.txt)"

答案3

文件修改时间,可以用日期格式化:

$ date -d @"$(stat -c %Y file1)" +'%Y%m%d%H%M%S'

用于%X上次访问时间和%Z上次更改。

%X然而, 、%Y和的最大分辨率%Z为秒。
对于纳秒分辨率,请使用%x,%y%z选项:

$ date -d "$(stat -c %y file1)" +'%Y%m%d%H%M%S.%N'
20151101020000.012345678

由于我们已经在使用日期,我们可以通过使用日期-r选项来简化,或者我们可以使用 find 的格式化输出:

$ date -r file1 +'%Y%m%d%H%M%S%z'
20151101010000-0500
$ find file1 -printf '%TY%Tm%Td%TH%TM%2.2TS%Tz\n'
20151101010000-0500

上述命令的分辨率为秒。如果需要纳秒:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678-0500
$ find file1 -printf '%TY%Tm%Td%TH%TM%TS%Tz\n'
20151101010000.0123456780-0500

这两个命令给出了修改时间。
在日期中,无法使用该-r选项获取访问或状态时间。
在查找中:将访问时间的%T更改为%A,将状态更改时间的%C更改为%C


关于时区

请注意,上述所有命令均受所使用时区的影响:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678
$ TZ=GMT0 date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101060000.012345678

请注意小时从01变为06。发生这种情况是因为所使用的计算机的时区设置为America/New_York。当时间以GMT0偏移量(又名GMTGMT+0GMT-0)计算时,其值会增加 5 小时。

此外,使用本地时间值(如果不完整)可能会在实际不同时呈现相同的值:

$ date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N'
20151101010000.012345678
20151101010000.012345678

%z这就是为什么需要尾矿当地的次数:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'; date -r file2 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678-0500
20151101010000.012345678-0400

这使得价值观不同。但这种格式使得按时间排序变得困难。这就是为什么最好的解决方案是使用GMT时间,因为时间偏移量 ( %z) 始终是0并且可以省略:

$ ( TZ=GMT0; date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N')
20151101060000.012345678
20151101050000.012345678

并且排序是可能的。

[1]用于触摸所用文件的值。
touch -m -d '20151101 01:00:00.012345678-05' file1
touch -a -d '20151101 01:00:00.987654321-05' file1
touch -m -d '20151101 01:00:00.012345678-04' file2
touch - a -d '20151101 01:00:00.987654321-04' 文件2

相关内容