脚本中的文件名最后修改dateshell

我使用bash来build立一个脚本,我将在一个variables中获得一个文件名,然后用这个variables获取文件unix的最后修改date。

我需要得到这个修改date值,我不能使用stat命令。

你知道有什么方法可以使用常用的* nix命令吗?

为什么你不应该使用ls

解析ls是一个坏主意 。 不仅如此,文件名中某些字符的行为不确定,也不依赖于平台,为了您的目的, 过去六个月的时间里会混淆日期 。 总之,是的,它可能会在你有限的测试中为你工作。 它不会是平台无关的(所以没有可移植性),并且由于各种系统上“合法”文件名的范围,解析的行为并不能保证。 (例如,Ext4 允许在文件名中使用空格和换行符 )。

说了这么多,我个人会用ls因为它很快捷,简单;)

编辑

正如Hugo在评论中指出的,OP不想使用stat 。 另外,我还要指出下面的部分是BSD-stat特定的(当我在Ubuntu上测试时, %Sm标志不起作用; Linux有一个stat命令,如果你对它有兴趣,请阅读手册页 )。

所以,非stat解决方案:使用日期

date ,至少在Linux上,有一个标志: -r ,根据手册页 :

显示FILE的最后修改时间

所以,脚本化的解决方案将类似于这样的:

 date -r ${MY_FILE_VARIABLE} 

这将返回类似于这样的东西:

 zsh% date -r MyFile.foo Thu Feb 23 07:41:27 CST 2012 

为了解决OP的评论:

如果可能,使用可配置的日期格式

date有一个相当广泛的时间格式变量; 阅读手册页获取更多信息。

我不能100%确定所有“类UNIX系统”中的可移植date 。 对于基于BSD的(如OS X),这是行不通的; BSD日期的-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历元时间 ,日期是文件修改时间,其余是文件名。

示例命令的细分

stat -f "%m%t%Sm %N" ./*

  1. stat -f :调用stat ,并指定格式( -f )。
  2. %m :UNIX纪元时间。
  3. %t :输出中的制表符分隔符。
  4. %SmS表示将输出显示为一个stringm表示使用文件修改数据。
  5. %N :显示相关文件的名称。

脚本中的一条命令,如下所示:

 stat -f "%Sm" ${FILE_VARIABLE} 

会给你输出如:

 Jun 26 21:28:41 2012 

阅读手册页获取更多信息; 时间戳格式化由strftime完成。

有perl?

 perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime" 

怎么样:

 find $PATH -maxdepth 1 -name $FILE -printf %Tc 

有关可与%T一起使用的其他值,请参阅查找手册页。

你可以使用“date”命令添加所需格式选项的格式:

  date +%Y-%m-%d -r /root/foo.txt 

2013年5月27日

  date +%H:%M -r /root/foo.txt 

23:02

您可以使用ls -l列出最后修改时间,然后使用cut来删除修改日期:

 mod_date=$(ls -l $file_name | cut -c35-46) 

这在我的系统上工作,因为日期显示在列35到46之间。您可能需要在系统上使用它。

日期有两种不同的格式:

  • Mmm dd hh:mm
  • Mmm dd yyyy

一年多以前修改的文件将有更新的格式。 不到一年前修改的文件将不得不先格式化。 您可以搜索“:”并知道文件的格式:

 if echo "$mod_date" | grep -q ":" then echo "File was modified within the year" else echo "File was modified more than a year ago" fi