Module: Find

Defined in:
lib/framework/find.rb

Overview

The Find module supports the top-down traversal of a set of file paths.

For example, to total the size of all files under your home directory, ignoring anything in a “dot” directory (e.g. $HOME/.ssh):

require 'find'

total_size = 0

Find.find(ENV["HOME"]) do |path|
  if FileTest.directory?(path)
    if File.basename(path)[0] == ?.
      Find.prune       # Don't look any further into this directory.
    else
      next
    end
  else
    total_size += FileTest.size(path)
  end
end

Class Method Summary collapse

Class Method Details

.find(*paths) ⇒ Object

Calls the associated block with the name of every file and directory listed as arguments, then recursively on their subdirectories, and so on.

See the Find module documentation for an example.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/framework/find.rb', line 35

def find(*paths) # :yield: path
  block_given? or return enum_for(__method__, *paths)

  paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup}
  while file = paths.shift
    catch(:prune) do
	yield file.dup.taint
      next unless File.exist? file
	begin
 if File.lstat(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

.pruneObject

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

See the Find module documentation for an example.



76
77
78
# File 'lib/framework/find.rb', line 76

def prune
  throw :prune
end