使用Bash获取特定文件的mtime?

时间:2011-01-23 14:40:21

标签: bash shell

我很清楚能够find myfile.txt -mtime +5检查我的文件是否超过5天。但是我想在myfile.txt的几天内获取mtime并将其存储到变量中以供进一步使用。我该怎么做?

4 个答案:

答案 0 :(得分:56)

stat可以为您提供以下信息:

filemtime=`stat -c %Y myfile.txt`

%Y给你最后修改为“自大纪元以来的秒数”,但还有很多其他选项; more info。因此,如果该文件在2011-01-22格林尼治标准时间15:30进行了修改,则上述内容将返回1295710237区域内的数字。

编辑:啊,您想要自修改以来的几天内的时间。这将更复杂,尤其是因为“一天”不是固定的时间段(一些“天”只有23小时,其他25天 - 由于夏令时)。

天真版本可能如下所示:

filemtime=`stat -c %Y $1`
currtime=`date +%s`
diff=$(( (currtime - filemtime) / 86400 ))
echo $diff

......但是,假设一天总是完全是86,400秒。

有关bash here中算术的更多信息。

答案 1 :(得分:4)

日期实用程序有一个方便的开关,用于从文件中提取 mtime,然后您可以使用格式字符串显示或存储它。

date -r file "+%F"
# 2021-01-12
file_mtime=$(date -r file "+%F")

man date,日期的输出由以"+"开头的格式字符串控制

用于比较多个日期的有用格式字符串可能包括:

"+%j": day of year
"+%s": unix epoch time

用日期算术在 bash 中有点麻烦,所以如果您需要在所有极端情况下都适用的相对时间,那么使用另一种语言可能会更好。

答案 2 :(得分:3)

AGE=$(perl -e 'print -M $ARGV[0]' $file)

将$ AGE设置为$ file的年龄,因为Perl的-M运算符处理stat调用以及为您转换为天数。

返回值是浮点值(例如,6.62849537天)。如果需要整数结果,请在表达式中添加int

AGE=$(perl -e 'print int -M $ARGV[0]' $file)

Ruby和Python也有他们的单行来统计文件并返回一些数据,但我相信Perl有最简洁的方法。

答案 3 :(得分:2)

我这是答案吗?

A=$(stat -c "%y" myfile.txt)

查看stat-help

stat --help
Usage: stat [OPTION]... FILE...
Display file or file system status.
[...]
-c  --format=FORMAT   use the specified FORMAT instead of the default;
                      output a newline after each use of FORMAT
[...]
The valid format sequences for files
[...]
  %y   Time of last modification, human-readable
  %Y   Time of last modification, seconds since Epoch
[...]