22

How do I compare the timestamp of two files?

I tried this but it doesn't work:

file1time=`stat -c %Y fil1.txt`
file2time=`stat -c %Y file2.txt`
if[$file1time -gt $file2time];
then
 doSomething
fi

I printed both the time stamps, in order and it gives me

1273143480
1254144394
./script.sh: line 13: [1273143480: command not found

So basically if comparison is not working, I guess. Or if there is any other nice way than what I am doing, please let me know. What do I have to change?

Jens Erat
  • 17,507
  • 14
  • 61
  • 74
newcoderintown
  • 329
  • 1
  • 2
  • 4

4 Answers4

39

The operators for comparing time stamps are:

[ $file1 -nt $file2 ]
[ $file1 -ot $file2 ]

The mnemonic is easy: 'newer than' and 'older than'.

Jonathan Leffler
  • 5,003
  • 1
  • 30
  • 37
6

This is because of some missing spaces. [ is a command, so it must have spaces around it and the ] is an special parameter to tell it where its comand line ends. So, your test line should look like:

if [ $file1time -gt $file2time ];
goedson
  • 936
  • 4
  • 8
  • 4
    `[` is a test command -- see the "CONDITIONAL EXPRESSIONS" section of the `bash` man page. There's also a standalone executable in `/usr/bin/test` and `/usr/bin/[`, but if you're using bash and not using the full path, yo u're using the shell builtin. – Doug Harris May 06 '10 at 13:11
  • @Doug Harris +1 for the more complete explanation about the topic. – goedson May 06 '10 at 13:18
2

if is not magic. It attempts to run the command passed to it, and checks if it has a zero exit status. It also doesn't handle non-existent arguments well, which is why you should quote variables being used in it.

if [ "$file1time" -gt "$file2time" ]
Ignacio Vazquez-Abrams
  • 111,361
  • 10
  • 201
  • 247
0
if ( [ $file1time -gt $file2time ] );
then
 doSomething
fi                                                                    
Renju Chandran chingath
  • 1,465
  • 3
  • 12
  • 19
  • 1
    The parentheses are superfluous. They force the test to be run in a subshell. The square brackets with space around them are sufficient. – Jonathan Leffler Mar 17 '20 at 00:31