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

时间:2012-06-26 17:18:51

标签: linux bash shell unix hp-ux

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

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

你知道用普通的* nix命令来获取它吗?

5 个答案:

答案 0 :(得分:17)

为什么不应该使用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在评论中指出的那样,OP不想使用stat。另外,我应该指出以下部分是特定于BSD-stat的(当我在Ubuntu上测试时,%Sm标志不起作用; Linux有一个stat命令,如果你感兴趣的话它读了man page)。

因此,非stat解决方案:使用日期

date,至少在Linux上,有一个标记:-r,根据man page

  

显示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 -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" ./*

  1. stat -f:致电stat,并指定格式(-f)。
  2. %m:UNIX纪元时间。
  3. %t:输出中的标签分隔符。
  4. %SmS表示将输出显示为stringm表示使用文件修改数据。
  5. %N:显示相关文件的名称。
  6. 脚本中的命令沿着以下行:

    stat -f "%Sm" ${FILE_VARIABLE}
    

    将为您提供输出,例如:

    Jun 26 21:28:41 2012
    

    阅读stat {{1}}了解更多信息;时间戳格式由man page完成。

答案 1 :(得分:4)

有perl吗?

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

答案 2 :(得分:3)

怎么样:

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

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

答案 3 :(得分:1)

您可以使用"日期"命令添加所需的格式选项格式:

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

2013年5月27日

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

23:02

答案 4 :(得分:-2)

您可以使用列出上次修改时间的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