xawk.com - technical wisdom served up in little slices xawk.com -- Tags -- Ruby
 
xawk.com -- Tags -- Ruby -- Check for File Changes using Ruby and MD5

Check for File Changes using Ruby and MD5

by Brad Trupp (c) 2008

In an earlier article Create checkpoints using Ruby and MD5, I wrote about using the MD5 function in Ruby to create an checkpoint for all files in a directory.

Now the next step in this process is to use that initial checkpoint file as a starting point to find all changes that have happened since.

Here is a simple Ruby script to compare current checksums against an initial checksum hash file.

This particular example shows the basics of processing all the files in a directory and all the subdirectories underneath. In this case, my subdirectory is "out" and I am only processing files with a ".html" extension.

Note that the md5 checksums are loaded into a hash, sorted, and compared to find what's new, what has been added, and what has been removed.

checkpoint_changes.rb


#!/usr/bin/ruby -w
require 'digest/md5'

md5FileHash = {}
oldFileHash = {}

#----------------------------------------------------------------------
# Pass 0 - Get file list
#----------------------------------------------------------------------

theFileList = [];
Dir['out/**/*.html'].each do |fnn|
theFileList << fnn.downcase;
end;

#----------------------------------------------------------------------
# Pass 1 - calc md5
#----------------------------------------------------------------------

theFileList.each do |f|
digest = Digest::MD5.hexdigest(File.read(f))
md5FileHash[f] = digest;
end;

#----------------------------------------------------------------------
# Pass 2 - read old array from file
#----------------------------------------------------------------------

File.open("sync.dat").each do |line|
line = line.chop;
md5x = line[0,32];
filx = line[32,255];
oldFileHash[filx] = md5x;
end;


#----------------------------------------------------------------------
# Pass 3a - look for additions
# ( preferred upload order is additions, changes, then deletes)
#----------------------------------------------------------------------

for ddd in md5FileHash.keys.sort do
md5old = oldFileHash[ddd];
md5new = md5FileHash[ddd];
if md5old.nil? then puts "++ #{ddd}"; end;
end;

#----------------------------------------------------------------------
# Pass 3b - look for changes ( preferred upload order)
#----------------------------------------------------------------------

for ddd in md5FileHash.keys.sort do
md5old = oldFileHash[ddd];
md5new = md5FileHash[ddd];
if md5new != md5old then if !md5old.nil? then puts "<> #{ddd}"; end; end;
end;

#----------------------------------------------------------------------
# Pass 5 - look for deletes
#----------------------------------------------------------------------

for ddd in oldFileHash.keys.sort do
md5old = oldFileHash[ddd];
md5new = md5FileHash[ddd];
if md5new.nil? then puts "-- #{ddd}"; end;
end;

puts "DIFF complete.";

View Comments (0)

Tags: Ruby

Share: Del.icio.us | Digg | Facebook | Google Bookmarks | Reddit | Technorati | Windows Live | Yahoo! My Web


 

Tag: Ruby
Using Ruby to fix id3 tags on mp3 files
Copy all files in a directory tree to a common destination.
Check for File Changes using Ruby and MD5
Create Checkpoints using Ruby and MD5

All Tags
Apple
Bash
Business Tips
Css
Delphi
Firefox
Gmail
Html
MySql
Php
Productivity Tips
Ruby
Ubuntu
Website Tips
Windows XP

Search