Module | Find |
In: |
lib/find.rb
|
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
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.
# File lib/find.rb, line 35 35: def find(*paths) # :yield: path 36: paths.collect!{|d| d.dup} 37: while file = paths.shift 38: catch(:prune) do 39: yield file.dup.taint 40: next unless File.exist? file 41: begin 42: if File.lstat(file).directory? then 43: d = Dir.open(file) 44: begin 45: for f in d 46: next if f == "." or f == ".." 47: if File::ALT_SEPARATOR and file =~ /^(?:[\/\\]|[A-Za-z]:[\/\\]?)$/ then 48: f = file + f 49: elsif file == "/" then 50: f = "/" + f 51: else 52: f = File.join(file, f) 53: end 54: paths.unshift f.untaint 55: end 56: ensure 57: d.close 58: end 59: end 60: rescue Errno::ENOENT, Errno::EACCES 61: end 62: end 63: end 64: end
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.
# File lib/find.rb, line 74 74: def prune 75: throw :prune 76: end