2009-08-15 23 views
21

¿Alguien sabe si existe un módulo/función existente dentro de Ruby para recorrer los directorios y archivos del sistema de archivos? Estoy buscando algo similar a os.walk de Python. El módulo más cercano que he encontrado es Find, pero requiere un poco de trabajo adicional para hacer el recorrido.¿Cuál es el equivalente Ruby de os.walk de Python?

código Python tiene el siguiente aspecto:

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

Respuesta

22

Lo siguiente imprimirá todos los archivos de forma recursiva. Entonces puedes usar File.directory? para ver si es un directorio o un archivo.

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

en lugar de 'Dir [foo] .Cada {}' barra, se puede usar 'Dir.glob (foo) {} bar 'que iterará sobre todos los archivos que coincidan con el bloque sin crear primero una matriz temporal. – sepp2k

+0

Es 'Dir.foreach ('.') {| F | imprima f} 'lo mismo? Se ve más expresivo que la versión []. –

+1

@ Thierry: No. Dir.foreach no ingresa subdirectorios. – sepp2k

8

Find parece bastante simple para mí:

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

¿Y dónde se define 'Find'? 'require" find "' Aquí están los documentos: 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('.') 
Cuestiones relacionadas