如何判断文件是否超过/ bin / sh 30分钟?

时间:2010-01-05 09:18:30

标签: linux unix sh

如何在/ bin / sh中编写脚本以确定文件是否超过30分钟?

不幸的是,系统中不存在统计数据。这是一个旧的Unix系统,http://en.wikipedia.org/wiki/Interactive_Unix

很遗憾,Perl没有安装在系统上,客户也不想安装它,也没有其他任何东西。

12 个答案:

答案 0 :(得分:65)

这是使用find的一种方式。

if test "`find file -mmin +30`"

如果相关文件包含空格或特殊字符,则必须引用find命令。

答案 1 :(得分:27)

以下为您提供以秒为单位的文件年龄:

echo $(( `date +%s` - `stat -L --format %Y $filename` ))

这意味着对于超过30分钟的文件,这应该给出一个真/假值(1/0):

echo $(( (`date +%s` - `stat -L --format %Y $filename`) > (30*60) ))

30*60 - 一分钟内60秒,不要预先计算,让CPU为你完成工作!

答案 2 :(得分:16)

如果你正在写一个sh脚本,最有用的方法是使用test和已经提到的统计技巧:

if [ `stat --format=%Y $file` -le $(( `date +%s` - 1800 )) ]; then 
    do stuff with your 30-minutes-old $file
fi

请注意,[test的符号链接(或其他等效符号);请参阅man test,但请注意test[也是bash内置因素,因此可能会略有不同的行为。 (另请注意[[ bash复合命令。)

答案 3 :(得分:9)

好的,没有统计数字和残缺的发现。这是您的替代方案:

编译GNU coreutils以获得合适的查找(以及许多其他方便的命令)。你可能已经把它作为gfind了。

如果date有效,您可以使用-r来获取文件修改时间吗?

(`date +%s` - `date -r $file +%s`) > (30*60)

或者,使用-nt比较来选择哪个文件更新,麻烦是在过去30分钟制作一个mod时间的文件。 touch通常可以做到这一点,但所有投注都是关于可用的投注。

touch -d '30 minutes ago' 30_minutes_ago
if [ your_file -ot 30_minutes_ago ]; then
    ...do stuff...
fi

最后,看看Perl是否可用而不是挣扎于谁知道shell实用程序的版本。

use File::stat;
print "Yes" if (time - stat("yourfile")->mtime) > 60*30;

答案 4 :(得分:5)

对于像我这样的人,根据@slebetman的回答,他们不喜欢背蜱:

echo $(( $(date +%s) - $(stat -L --format %Y $filename) > (30*60) ))

答案 5 :(得分:4)

您可以通过与使用30分钟前的时间戳创建的参考文件进行比较来完成此操作。

首先输入

创建比较文件
touch -t YYYYMMDDhhmm.ss /tmp/thirty_minutes_ago

用30分钟前的值替换时间戳。您可以使用Perl中的一个简单的一个线程来自动执行此步骤。

然后使用find的较新运算符通过否定搜索运算符来匹配较旧的文件

find . \! -newer /tmp/thirty_minutes_ago -print

答案 6 :(得分:2)

超过30分钟超过30分钟修改,或超过30分钟前创建是什么意思?希望它是前者,因为到目前为止的答案对于这种解释是正确的。在后一种情况下,由于unix文件系统不跟踪文件的创建时间,因此存在问题。 (ctime文件属性记录上次更改 inode 内容时,即发生chmodchown之类的内容。

如果你真的需要知道文件是否是在30多分钟前创建的,你要么必须用find重复扫描文件系统的相关部分,要么使用像linux这样的平台依赖的东西。 inotify

答案 7 :(得分:2)

#!/usr/bin/ksh
## this script creates a new timer file every minute and renames all the previously created timer files and then executes whatever script you need which can now use the timer files to compare against with a find.  The script is designed to always be running on the server.  The first time the script is executed it will remove the timer files and it will take an hour to rebuild them (assuming you want 60 minutes of timer files)

set -x

# if the server is rebooted for any reason or this scripts stops we must rebuild the timer files from scratch
find /yourpath/timer -type f -exec rm {} \;

while [ 1 ]
do
COUNTER=60
COUNTER2=60
cd /yourpath/timer
while [ COUNTER -gt 1 ]
do
  COUNTER2=`expr $COUNTER - 1`
  echo COUNTER=$COUNTER
  echo COUNTER2=$COUNTER2
  if [  -f timer-minutes-$COUNTER2 ]
    then
       mv timer-minutes-$COUNTER2 timer-minutes-$COUNTER
       COUNTER=`expr $COUNTER - 1`
  else
     touch timer-minutes-$COUNTER2
  fi
done

touch timer-minutes-1
sleep 60

#this will check to see if the files have been fully updated after a server restart
COUNT=`find . ! -newer timer-minutes-30 -type f | wc -l | awk '{print $1}'`
if [ $COUNT -eq 1  ]
   then
     # execute whatever scripts at this point
fi

done

答案 8 :(得分:2)

您可以使用find命令。
例如,要搜索当前目录中超过30分钟的文件:

find . -type f -mmin +30 

您可以阅读 查找 命令HERE

答案 9 :(得分:0)

if [[ "$(date --rfc-3339=ns -r /tmp/targetFile)" < "$(date --rfc-3339=ns --date '90 minutes ago')" ]] ; then echo "older"; fi

答案 10 :(得分:0)

以下是find的变体:

if [ `find cache/nodes.csv -mmin +10 | egrep '.*'` ]

查找始终返回状态代码0,除非它失败;但是,egrep返回1找不到匹配项。因此,如果该文件超过10分钟,则会通过此组合。

试一试:

touch /tmp/foo; sleep 61; 
find /tmp/foo -mmin +1  | egrep '.*'; echo $?
find /tmp/foo -mmin +10 | egrep '.*'; echo $?

应该在文件路径后打印0然后再打印1。

我的功能使用:

##  Usage: if isFileOlderThanMinutes "$NODES_FILE_RAW" $NODES_INFO_EXPIRY; then ...
function isFileOlderThanMinutes {
  if [ "" == "$1" ] ; then serr "isFileOlderThanMinutes() usage: isFileOlderThanMinutes <file> <minutes>"; exit; fi
  if [ "" == "$2" ] ; then serr "isFileOlderThanMinutes() usage: isFileOlderThanMinutes <file> <minutes>"; exit; fi
  ##  Does not exist -> "older"
  if [ ! -f "$1" ] ; then return 0; fi
  ##  The file older than $2 is found...
  find "$1" -mmin +$2 | egrep '.*'  > /dev/null 2>&1;
  if [ $? == 0 ] ; then return 0; fi  ## So it is older.
  return 1;  ## Else it not older.
}

答案 11 :(得分:0)

当前时间与 myfile.txt 的上次修改时间之间的差异(以秒为单位):

echo $(($(date +%s)-$(stat -c "%Y" myfile.txt)))

您还可以将%X%Z与命令stat -c一起使用,以获取上次访问或上次状态更改之间的差异,请检查0返回!

%X time of last access, seconds since Epoch
%Y time of last data modification, seconds since Epoch
%Z time of last status change, seconds since Epoch

测试:

if [ $(($(date +%s)-$(stat -c "%Y" myfile.txt))) -lt 600 ] ; then echo younger than 600 sec ; else echo older than 600 sec ; fi