我使用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的解决方案,请参见下面的部分;)
使用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" ./*
stat -f
:调用stat
,并指定格式( -f
)。 %m
:UNIX纪元时间。 %t
:输出中的制表符分隔符。 %Sm
: S
表示将输出显示为一个string
, m
表示使用文件修改数据。 %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