Ruby 2.4

Find

module Find

Find模块支持自顶向下遍历一组文件路径。

例如,要总计主目录下所有文件的大小,忽略“dot”目录中的任何内容(例如$ 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

Public Class Methods

find(*paths, ignore_error: true) { |path| ... } Show source

调用相关的块,将每个文件和目录的名称列为参数,然后递归地在其子目录中,依此类推。

如果没有给出块,则返回一个枚举器。

有关Find示例,请参阅模块文档。

# File lib/find.rb, line 37 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.taint begin s = File.lstat(file) rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG raise unless ignore_error next end if s.directory? then begin fs = Dir.entries(file, encoding: enc) rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG raise unless ignore_error next end fs.sort! fs.reverse_each {|f| next if f == "." or f == ".." f = File.join(file, f) ps.unshift f.untaint } end end end end nil end

prune() Show source

跳过当前文件或目录,用下一个条目重新启动循环。如果当前文件是目录,则不会递归输入该目录。只在与:: find相关的块内有意义。

有关Find示例,请参阅模块文档。

# File lib/find.rb, line 83 def prune throw :prune end

私有实例方法

find(*paths, ignore_error: true) { |path| ... } Show source

调用相关的块,将每个文件和目录的名称列为参数,然后递归地在其子目录中,依此类推。

如果没有给出块,则返回一个枚举器。

有关Find示例,请参阅模块文档。

# File lib/find.rb, line 37 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.taint begin s = File.lstat(file) rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG raise unless ignore_error next end if s.directory? then begin fs = Dir.entries(file, encoding: enc) rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG raise unless ignore_error next end fs.sort! fs.reverse_each {|f| next if f == "." or f == ".." f = File.join(file, f) ps.unshift f.untaint } end end end end nil end

prune() Show source

跳过当前文件或目录,用下一个条目重新启动循环。如果当前文件是目录,则不会递归输入该目录。只在与:: find相关的块内有意义。

有关Find示例,请参阅模块文档。

# File lib/find.rb, line 83 def prune throw :prune end