Linux下用shell获取指定文件的最后修改时间并与系统时间比对,如果相差时间超过3分钟则执行另一个脚本

如果指定的文件最后修改时间比系统时间晚3分钟以上则执行相关的命令或者另一个shell脚本... 如果指定的文件最后修改时间比系统时间晚3分钟以上则执行相关的命令或者另一个shell脚本 展开
 我来答
花花浪客
2013-05-02 · TA获得超过2069个赞
知道小有建树答主
回答量:792
采纳率:100%
帮助的人:710万
展开全部

使用date命令加上合适的时间格式化字符串(+%s),会显示当前时间(或-d参数指定的时间)与1970-01-01 00:00:00相差的秒数(详细可以参考date的man手册)

所以基本想法就是使用date命令分别获取当前时间与文件修改时间的秒数,然后看这2个秒数之间是否有相差180秒以上。

获取当前时间比较简单,直接date +%s就ok了

下面看看如何获取文件时间

使用stat 命令后面跟一个文件名可以获取文件的状态,包括文件修改时间。其中文件修改时间会单独一行显示,格式如下:Modify: 2013-02-21 17:58:05.404876407 +0800 (具体的精度可能系统不同略微有些差别,但大致格式是这样)

所以我们可以stat myfilename | grep Modify来获取文件的修改时间的信息,然后通过awk分别获取时间的日期和时间段

stat myfilename | grep Modify | awk '{print $2}'  #这句获取了日期段,即上面例子里面的2013-02-21

stat myfilename | grep Modify | awk '{split($3,var,".");print var[1]}' #这句获取了时间段,即上面例子里面的17:58:05,具体关于awk的使用可以参考awk的使用手册

那么现在可以获取文件修改时间与1970-01-01 00:00:00相差的描述了,就是date -d "$file_date $file_time" +%s

那么这个时间与当前时间想减的结果与180相比就可以知道是否满足条件了,满足条件的话就可以执行相应的命令。

参考代码如下:

current_datetime=`date +%s`
filedate=`stat tt.txt | grep Modify | awk '{print $2}'`
filetime=`stat tt.txt | grep Modify | awk '{split($3,var,".");print var[1]}'`
file_datetime=`date -d "$filedate $filetime" +%s
timedelta=`expr $current_datetime - $file_datetime`
if [ "$timedelta" -gt "180" ];then
echo "match condition"
fi
ace_fei
推荐于2017-09-30 · TA获得超过2013个赞
知道小有建树答主
回答量:734
采纳率:100%
帮助的人:723万
展开全部
想必你已经在chinaunix上找到答案了吧。
a=`stat -c %Y filename`;b=`date +%s`;if [ $[ $b - $a ] -gt 180 ];then command;else othercommand;fi就挺好的
但是你要注意在crontab中执行的时候需要加source一下环境变量,不然有些命令会找不到路径。
如:
0-59 * * * * . /etc/profile;a=`stat -c %Y filename`;b=`date +%s`;if [ $[ $b - $a ] -gt 180 ];then command;else othercommand;fi
. /etc/profile可以换成你用户目录下的配置文件.
C shell的为 .cshrc 在用户主目录下
bashell的为 .bashrc 在用户主目录下
kshell的为.profile 在用户主目录下
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
seesea2517
2013-05-03 · TA获得超过1480个赞
知道小有建树答主
回答量:512
采纳率:100%
帮助的人:553万
展开全部
如下测试,请参考。
当前时间 10:22,创建三个文件 1.txt 2.txt 3.txt,上一层目录有脚本 test.sh,内容为简单输出所有参数。使用 find 实现你所要求的功能。
(如果你的脚本在别的地方,请在 find 语句中相应修改)

[seesea@UC find]$ date
2013年 05月 03日 星期五 10:22:28 CST

[seesea@UC find]$ ll
总计 8
-rw-rw-r-- 1 huangyd huangyd 4 05-03 10:15 1.txt
-rw-rw-r-- 1 huangyd huangyd 4 05-03 10:15 2.txt
-rw-rw-r-- 1 huangyd huangyd 0 05-03 10:22 3.txt

[seesea@UC find]$ cat ../test.sh
echo "Test script. Args: $*"

[seesea@UC find]$ find * -mmin +3 -exec ../test.sh {} \;
Test script. Args: 1.txt
Test script. Args: 2.txt
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式