267 votos

Iterar a través de todos los archivos en un directorio

¿Cómo puedo escribir un bucle en ruby para que yo pueda ejecutar un bloque de código en cada archivo?

Soy nuevo en ruby, y yo he concluido que la forma de hacer esto es hacer un cada lazo.
El rubí archivo se ejecutará desde un directorio diferente que quiero recorrer el directorio.

He probado el Dir.foreach y no pude hacerlo funcionar.

420voto

Telemachus Puntos 12013

Como otros han dicho, Dir.foreach es una buena opción aquí. Sin embargo, tenga en cuenta que Dir.entries y Dir.foreach siempre mostrará . y .. (el actual y los padres de los directorios). Por lo general usted no quiere trabajar en ellos, entonces usted puede hacer algo como esto:

Dir.foreach('/path/to/dir') do |item|
  next if item == '.' or item == '..'
  # do work on real items
end

Dir.foreach y Dir.entries también mostrar todos los elementos en el directorio ocultos y no ocultos por igual. A menudo esto es lo que quieres, pero si no lo es, usted necesita hacer algo para saltar sobre los directorios y ficheros ocultos.

Alternativamente, usted puede desear mirar en Dir.glob que proporciona una simple coincidencia de caracteres comodín:

Dir.glob('/path/to/dir/*.rb') do |rb_file|
  # do work on files ending in .rb in the desired directory
end

96voto

Simple As Could Be Puntos 3906

Este es mi método preferido por ser fácil de leer:

Dir.glob("*/*.txt") do |my_text_file|
  puts "working on: #{my_text_file}..."
end

Y ni siquiera puede extender esto funcione en todos los archivos en subdirectorios:

Dir.glob("**/*.txt") do |my_text_file| # note one extra "*"
  puts "working on: #{my_text_file}..."
end

28voto

wawka Puntos 237

Dir dispone de sintaxis más corta para obtener una matriz de todos los archivos del directorio:

Dir['dir/to/files/*'].each do |fname|
    # do something with fname
end

25voto

Fred Puntos 4213
Dir.foreach("/home/mydir") do |fname|
  puts fname
end

13voto

Faisal Puntos 10585

La biblioteca del hallazgo está diseñada específicamente para esta tarea: http://stdlib.rubyonrails.org/libdoc/find/rdoc/index.html

require 'find'
Find.find(path) do |file|
  # process
end

Esto es una biblioteca estándar de ruby, así que debe estar disponible

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X