How to check if a file is older than 30 minutes in unix

user3484214 picture user3484214 · Apr 1, 2014 · Viewed 10.8k times · Source

I've written a script to iterate though a directory in Solaris. The script looks for files which are older than 30 minutes and echo. However, my if condition is always returning true regardless how old the file is. Someone please help to fix this issue.

for f in `ls -1`;
# Take action on each file. $f store current file name
do
  if [ -f "$f" ]; then
  #Checks if the file is a file not a directory
  if test 'find "$f" -mmin +30'
  # Check if the file is older than 30 minutes after modifications
  then
     echo $f is older than 30 mins
  fi
 fi
 done

Answer

Adrian Frühwirth picture Adrian Frühwirth · Apr 1, 2014
  1. You should not parse the output of ls
  2. You invoke find for every file which is unnecessarily slow

You can replace your whole script with

find . -maxdepth 1 -type f -mmin +30 | while IFS= read -r file; do
    [ -e "${file}" ] && echo "${file} is older than 30 mins"
done

or, if your default shell on Solaris supports process substitution

while IFS= read -r file; do
    [ -e "${file}" ] && echo "${file} is older than 30 mins"
done < <(find . -maxdepth 1 -type f -mmin +30)

If you have GNU find available on your system the whole thing can be done in one line:

find . -maxdepth 1 -type f -mmin +30 -printf "%s is older than 30 mins\n"