[英]Check last modified date is within n seconds
我需要检查目录中所有文件的最后修改日期,以查看最新文件是否已在任意时期内被修改。 例如。 200秒
这是一个转折点,它也必须是单线的(它具有Marathon运行状况检查功能,我不能依靠在那里的脚本文件系统)。
这是我到目前为止的内容:
ls -v | tail -n 1 | expr $(date +%s) - $(xargs date +%s -r) | if [ $PREV -gt 100 ]; then echo 1; else echo 0; fi
ls -v以“自然顺序”对目录内容进行排序(文件名单调递增),因此最新文件将始终是最后一个文件。 tail -n 1获取最后一个值。
然后expr $(date +%s)-$(xargs date +%s -r)从现在开始减去文件的上次修改日期,作为unix时间戳。
接下来,我想将结果传递给if语句,并根据与常量的比较返回0或1。 但是我不知道如何将管道输出放入if语句中。
注意:我知道我可以在包裹减法的上一个管道中进行if检查,但是我认为单线已经很混乱了。
任何帮助表示赞赏。 主机操作系统是Linux。 打击壳。
假设find
了GNU(假设问题中使用了其他GNU工具,这是一个合理的假设):
if [[ $(find . -maxdepth 1 -type f -newermt '-200 seconds' -print -quit) ]]; then
echo "The newest file is less than 200 seconds old"
else
echo "The newest file is more than 200 seconds old"
fi
在具有BSD工具(例如MacOS)的系统上,它可能是:
if [[ $(find . -maxdepth 1 -type f -mtime -200s -print -quit) ]]; then
echo "The newest file is less than 200 seconds old"
else
echo "The newest file is more than 200 seconds old"
fi
上面的两种方法(适用于当前平台)都将在目录中find
,直到找到不到200秒的单个文件为止。 并会在此时停止并打印该文件的名称。 与使用ls
对整个列表进行排序(或在找到一个文件后继续扫描更多文件)相比,这使大型目录的搜索效率更高。
还要注意使用[[ ]]
来抑制字符串拆分-使用[ ]
,需要使用$( )
引号来确保文件名中带有空格的文件名或名称可以扩展为glob的文件的正确行为。表达式。
此代码有效。
if [ `expr $(date +%s) - $(stat -c %Y $(ls -t | head -n 1))` -gt 100 ];then echo 1;else echo 0;fi
它是如何工作的?
ls -t-根据时间列出文件。
head -n 1-给出第一个最新文件。
date +%s给出从纪元起经过的时间。
stat -c%Y-给出自时期以来的修改时间
expr-从修改的文件日期中减去当前日期。
编辑-1
根据查尔斯的建议
echo $(( $(date +%s) - $(printf '%s\\0' * | xargs -0 stat -c '%Y' | sort -g | tail -n 1) > 100 ))
这是更优雅的方式。
我认为我不明白您的要求,但您可以尝试以下
PREV=$(ls -v | tail -n 1 | expr $(date +%s) - $(xargs date +%s -r)) ; if [ $PREV -gt 100 ]; then echo 1; else echo 0; fi
如果您正在寻找其他东西,请再提供一些提示。 这里的$PREV
多少? 你跟100的内部比较这if
但哪里PREV
价值从何而来?
在回答我自己的问题时,我想到了:
ls -v | tail -n 1 | expr $(date +%s) - $(xargs date +%s -r) | if [ $(xargs) -gt 150 ]; then echo 1; else echo 0; fi
我需要的修改是使用命令替换:$(xargs)获得先前的管道输出。
但是我比bigbounty的解决方案更喜欢我的解决方案。 标记为已解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.