2009-08-15 6 views
21

Weiß jemand, ob in Ruby ein Modul/eine Funktion vorhanden ist, um Dateisystemverzeichnisse und Dateien zu durchlaufen? Ich suche nach etwas ähnlich Pythons os.walk. Das nächste Modul, das ich gefunden habe, ist Find, erfordert aber etwas zusätzliche Arbeit, um die Traversierung zu machen.Was ist das Ruby-Äquivalent von Pythons os.walk?

Der Python-Code sieht wie folgt aus:

for root, dirs, files in os.walk('.'): 
    for name in files: 
     print name 
    for name in dirs: 
     print name 

Antwort

22

Nachfolgend alle Dateien rekursiv gedruckt werden. Dann können Sie File.directory verwenden? um zu sehen, ob es ein Verzeichnis oder eine Datei ist.

Dir['**/*'].each { |f| print f } 
+9

Statt 'Dir [foo] .each {bar}', können Sie 'Dir.glob (foo) {bar} ', die über alle Dateien iteriert, die mit dem Block übereinstimmen, ohne zuerst ein temporäres Array zu erstellen. – sepp2k

+0

Ist 'Dir.foreach ('.') {| F | Druck f} 'das gleiche? Es sieht aussagekräftiger aus als die [] Version. –

+1

@Thierry: Nein. Dir.foreach gibt keine Unterverzeichnisse ein. – sepp2k

8

Find scheint ziemlich einfach zu mir:

require "find" 
Find.find('mydir'){|f| puts f} 
+0

Und wo ist 'Find' definiert? 'require" find "' Hier ist die Dokumentation: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/find/rdoc/Find.html – Sukima

3
require 'pathname' 

def os_walk(dir) 
    root = Pathname(dir) 
    files, dirs = [], [] 
    Pathname(root).find do |path| 
    unless path == root 
     dirs << path if path.directory? 
     files << path if path.file? 
    end 
    end 
    [root, files, dirs] 
end 

root, files, dirs = os_walk('.') 
Verwandte Themen