How can I tell if a file is older than 30 minutes

2020-05-24 19:08发布

How do I write a script to determine if a file is older than 30 minutes in /bin/sh?

Unfortunately does not the stat command exist in the system. It is an old Unix system, http://en.wikipedia.org/wiki/Interactive_Unix

Perl is unfortunately not installed on the system and the customer does not want to install it, and nothing else either.

标签: linux unix sh
11条回答
smile是对你的礼貌
2楼-- · 2020-05-24 20:03

Here's one way using find.

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

The find command must be quoted in case the file in question contains spaces or special characters.

查看更多
走好不送
3楼-- · 2020-05-24 20:04
if [[ "$(date --rfc-3339=ns -r /tmp/targetFile)" < "$(date --rfc-3339=ns --date '90 minutes ago')" ]] ; then echo "older"; fi
查看更多
ら.Afraid
4楼-- · 2020-05-24 20:11

Ok, no stat and a crippled find. Here's your alternatives:

Compile the GNU coreutils to get a decent find (and a lot of other handy commands). You might already have it as gfind.

Maybe you can use date to get the file modification time if -r works?

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

Alternatively, use the -nt comparision to choose which file is newer, trouble is making a file with a mod time 30 minutes in the past. touch can usually do that, but all bets are off as to what's available.

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

And finally, see if Perl is available rather than struggling with who knows what versions of shell utilities.

use File::stat;
print "Yes" if (time - stat("yourfile")->mtime) > 60*30;
查看更多
Evening l夕情丶
5楼-- · 2020-05-24 20:12
#!/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
查看更多
▲ chillily
6楼-- · 2020-05-24 20:13

You can do this by comparing to a reference file that you've created with a timestamp of thirty minutes ago.

First create your comparison file by entering

touch -t YYYYMMDDhhmm.ss /tmp/thirty_minutes_ago

replacing the timestamp with the value thirty minutes ago. You could automate this step with a trivial one liner in Perl.

Then use find's newer operator to match files that are older by negating the search operator

find . \! -newer /tmp/thirty_minutes_ago -print
查看更多
登录 后发表回答