class method
Find.find
(*::String | ::_ToPath paths, ?ignore_error: ::boolish) -> ::Enumerator[::String, nil]
(*::String | ::_ToPath paths, ?ignore_error: ::boolish) { (::String) -> void } -> nil
find(*paths, ignore_error: true) { |path| ... }
lib/find.rb
View on GitHub ↗
# File tmp/rubies/ruby-4.0.0/lib/find.rb, line 41
def find(*paths, ignore_error: true) # :yield: path
block_given? or return enum_for(__method__, *paths, ignore_error: ignore_error)
fs_encoding = Encoding.find("filesystem")
paths.collect!{|d| raise Errno::ENOENT, d unless File.exist?(d); d.dup}.each do |path|
path = path.to_path if path.respond_to? :to_path
enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding
ps = [path]
while file = ps.shift
catch(:prune) do
yield file.dup
begin
s = File.lstat(file)
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EINVAL
raise unless ignore_error
next
end
if s.directory? then
begin
fs = Dir.children(file, encoding: enc)
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EINVAL
raise unless ignore_error
next
end
fs.sort!
fs.reverse_each {|f|
f = File.join(file, f)
ps.unshift f
}
end
end
end
end
nil
end
Calls the associated block with the name of every file and directory listed as arguments, then recursively on their subdirectories, and so on.
Returns an enumerator if no block is given.
See the Find module documentation for an example.