How to compare file timestamps in bash?

17

7

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?

newcoderintown

Posted 2010-05-06T10:53:32.150

Reputation: 179

1Your code needs spaces around the square brackets. – Jonathan Leffler – 2010-05-06T15:02:57.587

The test mechanism is very complex compared with the built in mechanism for comparing time stamps. – Jonathan Leffler – 2010-05-06T15:03:32.360

Answers

26

The operators for comparing time stamps are:

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

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

Jonathan Leffler

Posted 2010-05-06T10:53:32.150

Reputation: 4 526

5

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

Posted 2010-05-06T10:53:32.150

Reputation: 896

3[ 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 – 2010-05-06T13:11:30.447

@Doug Harris +1 for the more complete explanation about the topic. – goedson – 2010-05-06T13:18:10.190

1

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

Posted 2010-05-06T10:53:32.150

Reputation: 100 516

0

if ( [ $file1time -gt $file2time ] );
then
 doSomething
fi                                                                    

user328064

Posted 2010-05-06T10:53:32.150

Reputation: 11