This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.

Finding the Files you Want
CodeExpectedActual
require 'find'
module Find
  def match(*paths)
    matched = []
    find(*paths) { |path| matched << path if yield path }
    return matched
  end
  module_function :match
end
require 'create_tree'
create_tree './' => 
  [ { 'Music' => ['cancelled_download.MP3', 
                  ['The Snails - Red Rocket.mp3', 'Song contents #1'],
                  ['The Snails - Moonfall.mp3', 'Song contents #2'] 
                 ]
    },
    { 'tmp' => ['empty1', 'empty2', ['README', 'Hi there!']] },
    { 'rubyprog-0.1' => [['rubyprog.rb', '#!/usr/bin/env ruby'], 
                         ['README', 'This Ruby program is great!']
                        ]
    }
  ]
Find the empty files.
Error! (Exception?) Here's stdout:
LoadError: no such file to load -- create_tree
	from (irb):10:in `require'
	from (irb):10
NoMethodError: undefined method `create_tree' for main:Object
	from (irb):22
Find.match('./') { |p| File.lstat(p).size == 0 }
["./tmp/empty2", "./tmp/empty1", "./Music/cancelled_download.MP3"] []
Find.match('./') { |p| ext = p[-4...p.size]; ext && ext.downcase == '.mp3' }
["./Music/The Snails - Red Rocket.mp3", []
Find.match('./') { |p| File.split(p)[1] == 'README' }
["./tmp/README", "./rubyprog-0.1/README"] []
Find.match('./') do |p| 
  Find.prune if p == "./tmp"  
  File.split(p)[1] == "README"
end
["./rubyprog-0.1/README"] []
must_start_with = "This Ruby program"
Find.match('./') do |p|
  if File.file? p
    open(p) { |f| f.read(must_start_with.size) == must_start_with }
  else
    false
  end
end
["./rubyprog-0.1/README"] []
def emacs_droppings(*paths)
  Find.match(*paths) do |p| 
    (p[-1] == ?~ and p[0] != ?~) or (p[0] == ?# and p[-1] == ?#)
  end
end
Finds all files that are larger than a certain threshold. Use this to
find the files hogging space on your filesystem.
def bigger_than(bytes, *paths)
  Find.match(*paths) { |p| File.lstat(p).size > bytes }  
end
Finds all files modified more recently than a certain number of seconds
ago.
def modified_recently(seconds, *paths)
  time = Time.now - seconds
  Find.match(*paths) { |p| File.lstat(p).mtime > time }  
end
Finds all files that haven't been accessed since they were last modified.
def possibly_abandoned(*paths)
  Find.match(*paths) { |p| f = File.lstat(p); f.mtime == f.atime }
end
nil