为什么你不应该使用ls:
解析ls is a bad idea。不仅文件名中某些字符的行为未定义和平台相关,为了您的目的,它会mess with dates when they're six months in the past。简而言之,是的,它可能会在您有限的测试中为您工作。它将不独立于平台(因此没有可移植性),并且鉴于各种系统上的“合法”文件名范围,您的解析行为不得到保证。 (Ext4,例如allows spaces and newlines in filenames)。
说了这么多,就我个人而言,我会使用ls,因为它既快速又简单;)
编辑
正如 Hugo 在 cmets 中指出的那样,OP 不想使用 stat。此外,我应该指出,以下部分是 BSD-stat 特定的(当我在 Ubuntu 上测试时,%Sm 标志不起作用;Linux 有一个 stat 命令,如果您对此感兴趣,请阅读 @ 987654324@)。
所以,一个非stat 的解决方案:使用日期
date,至少在Linux上,有一个标志:-r,根据man page:
显示文件的最后修改时间
因此,脚本化解决方案类似于:
date -r ${MY_FILE_VARIABLE}
这会返回类似这样的东西:
zsh% date -r MyFile.foo
Thu Feb 23 07:41:27 CST 2012
解决 OP 的评论:
如果可能的话,使用可配置的日期格式
date 有一组相当广泛的时间格式变量;阅读手册页以获取更多信息。
我不能 100% 确定 date 在所有“类 UNIX 系统”中的可移植性。对于基于 BSD 的(例如 OS X),这将不工作; BSD-date 的 -r 标志做了完全不同的事情。这个问题并没有具体说明解决方案的便携性。对于基于 BSD 的解决方案,请参阅下面的部分 ;)
更好的解决方案,BSD 系统(在 OS X 上测试,使用 BSD-stat;GNU stat 略有不同,但可以以相同的方式工作)。
使用stat。您可以使用-f 标志格式化stat 的输出,并且您可以选择仅显示文件修改数据(对于这个问题,这很好)。
例如stat -f "%m%t%Sm %N" ./*:
1340738054 Jun 26 21:14:14 2012 ./build
1340738921 Jun 26 21:28:41 2012 ./build.xml
1340738140 Jun 26 21:15:40 2012 ./lib
1340657124 Jun 25 22:45:24 2012 ./tests
其中第一位是UNIX epoch time,日期是文件修改时间,其余的是文件名。
示例命令分解
stat -f "%m%t%Sm %N" ./*
-
stat -f:调用stat,并指定格式(-f)。
-
%m:UNIX 纪元时间。
-
%t:输出中的制表符分隔符。
-
%Sm:S 表示将输出显示为string,m 表示使用文件修改数据。
-
%N:显示有问题的文件名。
脚本中的命令如下:
stat -f "%Sm" ${FILE_VARIABLE}
会给你输出如:
Jun 26 21:28:41 2012
阅读man pagestat了解更多信息;时间戳格式化由strftime 完成。