filename脚本中的最后修改日期shell

ode*_*dew 12 unix linux bash shell hp-ux

我正在使用bash构建一个脚本,我将在变量中获取文件名,然后使用此变量获取文件unix最后修改日期.

我需要获取此修改日期值,我不能使用stat命令.

你知道用常见的*nix命令来获取它吗?

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的解决方案,请参阅以下部分;)

一个更好的解决方案,BSD系统(在OS X上测试,使用BSD-stat; GNU stat略有不同,但可以以相同的方式工作).

使用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" ./*

  1. stat -f:call stat,并指定format(-f).
  2. %m:UNIX纪元时间.
  3. %t:输出中的选项卡分隔符.
  4. %Sm:S表示将输出显示为a string,m表示使用文件修改数据.
  5. %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.完成.

  • 你抱怨说`ls -l`不是便携式的,但是`date`的便携性更低.问题是BSD系统也使用`-r`参数,但出于不同的目的.换句话说,使用`-r`可能最终成为有效命令(退出状态= 0),但不能获得所需的结果. (2认同)

Ale*_*sky 3

怎么样:

find $PATH -maxdepth 1 -name $FILE -printf %Tc
Run Code Online (Sandbox Code Playgroud)

有关可与 %T 一起使用的其他值,请参阅查找联机帮助页。