Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash script — determine if file modified?

Tags:

bash

macos

I have a Bash script that repeatedly copies files every 5 seconds. But this is a touch overkill as usually there is no change.

I know about the Linux command watch but as this script will be used on OS X computers (which don’t have watch, and I don’t want to make everyone install macports) I need to be able to check if a file is modified or not with straight Bash code.

Should I be checking the file modified time? How can I do that?

Edit: I was hoping to expand my script to do more than just copy the file, if it detected a change. So is there a pure-bash way to do this?

like image 610
Alan H. Avatar asked Jan 14 '11 21:01

Alan H.


2 Answers

I tend to agree with the rsync answer if you have big trees of files to manage, but you can use the -u (--update) flag to cp to copy the file(s) over only if the source is newer than the destination.

cp -u

Edit

Since you've updated the question to indicate that you'd like to take some additional actions, you'll want to use the -nt check in the [ (test) builtin command:

#!/bin/bash

if [ $1 -nt $2 ]; then
  echo "File 1 is newer than file 2"
else
  echo "File 1 is older than file 2"
fi

From the man page:

file1 -nt file2
         True if file1 is newer (according  to  modification  date)  than
         file2, or if file1 exists and file2 does not.

Hope that helps.

like image 53
Glenn McAllister Avatar answered Oct 20 '22 17:10

Glenn McAllister


OS X has the stat command. Something like this should give you the modification time of a file:

stat -f '%m' filename

The GNU equivalent would be:

stat --printf '%Y\n' filename
like image 32
Dennis Williamson Avatar answered Oct 20 '22 17:10

Dennis Williamson