views:

275

answers:

5

Dear all,

I am trying to test how old ago a file was created (in secondes) with bash in a "if" statement. I need creation date, not modification.

Do you have any idea how to do this, without using a command like "find" with grep ?

+2  A: 

I'm afraid I cann't answer the question for creation time, but for last modification time you can use the following to get the epoch date, in seconds, since filename was last modified:

date --utc --reference=filename +%s

So you could then so something like:

modsecs=$(date --utc --reference=filename +%s)
nowsecs=$(date +%s)
delta=$(($nowsecs-$modsecs))
echo "File $filename was modified $delta secs ago"

if [ $delta -lt 120 ]; then
  # do something
fi

etc..

Update A more elgant way of doing this (again, modified time only): http://stackoverflow.com/questions/552724/how-do-i-check-in-bash-whether-a-file-was-created-more-than-x-time-ago

Joel
+3  A: 

Date of creation isn't stored on many often used filesystems. What filesystem do you use?

Martin Kopta
The problem would also be to get the time with standard tools that operate above VFS, no matter if the timestamp is stored or not. +1 for the only valid answer about creation timestamps...
TheBonsai
Ext2FS / ReiserFS (Linux/Debian)
JeffPHP
+1  A: 

you can use ls with --full-time

file1="file1"
file2="file2"
declare -a array
i=0
ls -go --full-time "$file1" "$file2" | { while read -r  a b c d time f
do    
  time=${time%.*}  
  IFS=":"
  set -- $time
  hr=$1;min=$2;sec=$3
  hr=$(( hr * 3600 ))
  min=$(( min * 60 ))  
  totalsecs=$(( hr+min+sec ))
  array[$i]=$totalsecs  
  i=$((i+1))
  unset IFS      
done
echo $(( ${array[0]}-${array[1]} ))
}
+1  A: 

If your system has stat:

modsecs=$(stat --format '%Y' filename)

And you can do the math as in Joel's answer.

Dennis Williamson
+1  A: 

Here is the best answer I found at the time being, but it's only for the modification time :

expr `date +%s` - `stat -c %Y /home/user/my_file`
JeffPHP