David A. Black wrote:
> HI --
> 
> On Thu, 12 May 2005, Jens Riedel wrote:
> 
>> Hello,
>> 
>> I'm quite new to Ruby.
>> I'd to walk through a directory tree and edit all jsp files in there.
>> 
>> I do it this way:
>> 
>> def editDirectory(path)
>>    Dir.entries(path).each { |filename|
>>      next if filename =~ /^\.+$/
>>      currFile = path + "/" + filename
>>      if(File.stat(currFile).directory?)
>>        editDirectory(currFile)
>>      elsif(filename =~ /(.+)\.jsp$/)
>>        # ... do something with the file
>>      end
>>    }
>> end
>> 
>> I'd like to know if there is a more professional or more "ruby-like"
>> way to do this...
> 
> You can use the 'find' module.  Here's a parameterized version, which
> takes as its arguments a path and a file extension, and yields back
> the filenames it finds one by one:
> 
>    require 'find'
> 
>    def find_by_extension(path, ext)
>      Find.find(path) do |f|
>        next unless FileTest.file?(f)
>        next unless /#{Regexp.escape(ext)}$/.match(f)
>        yield f
>      end
>    end
> 
>    # Example of usage:
> 
>    find_by_extension("/home/dblack", ".rb") do |f|
>      # do stuff with f
>    end
> 
> 
> David

Even more generic:

module Find
  def self.find_cond(dir, cond)
    find(dir){|f| yield f if cond === f}
  end
end

Find::find_cond ".", /\.jsp$/ do |f|
  puts f
end

# and including the file type test
proper_test = Object.new
def proper_test.===(f) /\.jsp$/ =~ f and File.file? f end

Find::find_cond ".", proper_test do |f|
  puts f
end

Hm, this might be worthwile to go into find.rb...

Kind regards

    robert