There have been many times over the years that I’ve been wanting a simple capability of monitoring changes in some directory or some files in my system.
The biggest challenge has been to look for something that works seamlessly across operating systems.
So, I thought of creating my own solution!
And as usual, I looked at Ruby first since that is, by default, on every system I touch!
Although, in my opinion, this program could as well have been written in any language.
The idea I came up with was
- get modified times of all files (even nested) inside a directory
- save them as a string to a file
- compare this every interval
The program eventually turned out looking like this –
prev = File.read('previous_times.txt') rescue "" watch_directory = File.expand_path(File.join('directory/to/monitor', '**/*')) mtimes = Dir[watch_directory].collect do |file_name| File.mtime file_name if File.file? file_name end.to_s puts "=== Have files been modified? ===" p mtimes != prev File.write('previous_times.txt', mtimes)
And to run this every 10 seconds, it can be wrapped in a while loop with a sleep.
while true ... # above code ... sleep 10 end
As usual, in situations like these, the best test is to check against a
node_modules folder. So, I tried it on one which had 9,379,193 files and which took around 75 seconds to scan. And it worked perfectly there too!