我想获取特定格式的文件的修改时间。
我怎样才能做到这一点 ?
我知道关于
stat -c %x find.txt
但我需要这种格式:
yyyymmddhh24miss
如果重要的话我正在使用ksh
。Linux 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
(但请注意,对于符号链接,它显示了修改时间目标符号链接的时间,而不是符号链接本身(这可能就像谁关心符号链接的运行时间一样,请参阅-L
做find
同样的事情))。
如果您ksh
是ksh93
并且它是在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
,那么当您通过名称调用它们时,这些内置函数将被自动调用)。
如果您不关心小数部分,请删除.%N
或find
,替换%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
偏移量(又名GMT
或GMT+0
或GMT-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