我正在使用bash构建一个脚本,我将在变量中获取文件名,然后使用此变量获取文件unix最后修改日期。
我需要获取此修改日期值,我不能使用stat命令。
你知道用普通的* nix命令来获取它吗?
答案 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的解决方案,请参阅以下部分;)
使用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" ./*
stat -f
:致电stat
,并指定格式(-f
)。 %m
:UNIX纪元时间。 %t
:输出中的标签分隔符。 %Sm
:S
表示将输出显示为string
,m
表示使用文件修改数据。 %N
:显示相关文件的名称。 脚本中的命令沿着以下行:
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