module Utils::Find

def find(*paths) # :yield: path

:yield: path

See the +Find+ module documentation for an example.

as arguments, then recursively on their subdirectories, and so on.
Calls the associated block with the name of every file and directory listed
def find(*paths) # :yield: path
  paths.collect!{|d| d.dup}
  while file = paths.shift
    catch(:prune) do
      yield file.dup.taint
      next unless File.exist? file
      begin
        if File.stat(file).directory? then
          d = Dir.open(file)
          begin
            for f in d
              next if f == "." or f == ".."
              if File::ALT_SEPARATOR and file =~ /^(?:[\/\\]|[A-Za-z]:[\/\\]?)$/ then
                f = file + f
              elsif file == "/" then
                f = "/" + f
              else
                f = File.join(file, f)
              end
              paths.unshift f.untaint
            end
          ensure
            d.close
          end
        end
      rescue Errno::ENOENT, Errno::EACCES
      end
    end
  end
end

def prune


See the +Find+ module documentation for an example.

Find::find.
recursively entered. Meaningful only within the block associated with
entry. If the current file is a directory, that directory will not be
Skips the current file or directory, restarting the loop with the next
def prune
  throw :prune
end