How can I tell if a file is older than 30 minutes from /bin/sh?
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.
Solution 1:
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.
Solution 2:
The following gives you the file age in seconds:
echo $(( `date +%s` - `stat -L --format %Y $filename` ))
which means this should give a true/false value (1/0) for files older than 30 minutes:
echo $(( (`date +%s` - `stat -L --format %Y $filename`) > (30*60) ))
30*60
-- 60 seconds in a minute, don't precalculate, let the CPU do the work for you!
Solution 3:
If you're writing a sh script, the most useful way is to use test
with the already mentioned stat trick:
if [ `stat --format=%Y $file` -le $(( `date +%s` - 1800 )) ]; then
do stuff with your 30-minutes-old $file
fi
Note that [
is a symbolic link (or otherwise equivalent) to test
; see man test
, but keep in mind that test
and [
are also bash builtins and thus can have slightly different behavior. (Also note the [[
bash compound command).
Solution 4:
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;
Solution 5:
For those like myself, who don't like back ticks, based on answer by @slebetman:
echo $(( $(date +%s) - $(stat -L --format %Y $filename) > (30*60) ))