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
-
.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.
-
.prune ⇒ Object
Skips the current file or directory, restarting the loop with the next entry.
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 |
.prune ⇒ Object
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 |