sim*_*ont 17
ls:解析ls是个坏主意.文件名中某些字符的行为不仅未定义且与平台有关,为了您的目的,它们会在过去六个月时混淆日期.简而言之,是的,在您的有限测试中它可能对您有用.它不是独立于平台的(因此不具有可移植性),并且鉴于各种系统上的"合法"文件名范围,无法保证解析的行为.(例如,Ext4 允许文件名中的空格和换行符).
说了这么多,我个人用,ls因为它快速而简单;)
正如雨果在评论中指出的那样,OP不想使用stat.另外,我应该指出以下部分是特定于BSD-stat的(%Sm当我在Ubuntu上测试时,该标志不起作用; Linux有一个stat命令,如果你对它感兴趣,请阅读手册页).
stat解决方案:使用日期date,至少在Linux上,有一个标志:-r,根据手册页:
显示FILE的最后修改时间
因此,脚本化解决方案与此类似:
date -r ${MY_FILE_VARIABLE}
Run Code Online (Sandbox Code Playgroud)
这将返回类似于此的东西:
zsh% date -r MyFile.foo
Thu Feb 23 07:41:27 CST 2012
Run Code Online (Sandbox Code Playgroud)
为了解决OP的评论:
如果可能,使用可配置的日期格式
date有一套相当广泛的时间格式变量; 阅读手册页以获取更多信息.
我不是100%确定date所有'类UNIX系统'的可移植性.对于基于BSD(如OS X),这将不工作; -rBSD-date 的标志完全不同.问题并没有"详细说明解决方案的可移植性." 对于基于BSD的解决方案,请参阅以下部分;)
使用stat.您可以stat使用-f标志格式化输出,并且可以选择仅显示文件修改数据(对于此问题,这是很好的).
例如,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
Run Code Online (Sandbox Code Playgroud)
第一位是UNIX纪元时间,日期是文件修改时间,其余是文件名.
示例命令的细分
stat -f "%m%t%Sm %N" ./*
stat -f:call stat,并指定format(-f).%m:UNIX纪元时间. %t:输出中的选项卡分隔符. %Sm:S表示将输出显示为a string,m表示使用文件修改数据.%N:显示相关文件的名称. 脚本中的命令沿着以下行:
stat -f "%Sm" ${FILE_VARIABLE}
Run Code Online (Sandbox Code Playgroud)
会给你输出如下:
Jun 26 21:28:41 2012
Run Code Online (Sandbox Code Playgroud)
阅读手册页以stat获取更多信息; 时间戳格式化由strftime.完成.
怎么样:
find $PATH -maxdepth 1 -name $FILE -printf %Tc
Run Code Online (Sandbox Code Playgroud)
有关可与 %T 一起使用的其他值,请参阅查找联机帮助页。