module Find
Das Modul Find unterstützt die Top-Down-Durchquerung einer Reihe von Dateipfaden.
Um beispielsweise die Größe aller Dateien in Ihrem Heimatverzeichnis zu ermitteln und alles in einem "Punkt"-Verzeichnis (z. B. $HOME/.ssh) zu ignorieren.
require 'find' total_size = 0 Find.find(ENV["HOME"]) do |path| if FileTest.directory?(path) if File.basename(path).start_with?('.') Find.prune # Don't look any further into this directory. else next end else total_size += FileTest.size(path) end end
Constants
- VERSION
-
Die Versionszeichenfolge
Öffentliche Klassenmethoden
Source
# File 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
Ruft den zugehörigen Block mit dem Namen jeder als Argumente aufgelisteten Datei und jedes Verzeichnisses auf und rekursiv mit deren Unterverzeichnissen usw.
Gibt einen Enumerator zurück, wenn kein Block gegeben wird.
Ein Beispiel finden Sie in der Dokumentation des Moduls Find.
Source
# File lib/find.rb, line 86 def prune throw :prune end
Überspringt die aktuelle Datei oder das aktuelle Verzeichnis und startet die Schleife mit dem nächsten Eintrag neu. Wenn die aktuelle Datei ein Verzeichnis ist, wird dieses Verzeichnis nicht rekursiv betreten. Nur aussagekräftig innerhalb des Blocks, der mit Find::find verbunden ist.
Ein Beispiel finden Sie in der Dokumentation des Moduls Find.
Private Instanzmethoden
Source
# File 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
Ruft den zugehörigen Block mit dem Namen jeder als Argumente aufgelisteten Datei und jedes Verzeichnisses auf und rekursiv mit deren Unterverzeichnissen usw.
Gibt einen Enumerator zurück, wenn kein Block gegeben wird.
Ein Beispiel finden Sie in der Dokumentation des Moduls Find.
Source
# File lib/find.rb, line 86 def prune throw :prune end
Überspringt die aktuelle Datei oder das aktuelle Verzeichnis und startet die Schleife mit dem nächsten Eintrag neu. Wenn die aktuelle Datei ein Verzeichnis ist, wird dieses Verzeichnis nicht rekursiv betreten. Nur aussagekräftig innerhalb des Blocks, der mit Find::find verbunden ist.
Ein Beispiel finden Sie in der Dokumentation des Moduls Find.