cadenas - archivos en ruby
Iterar a través de cada archivo en un directorio (7)
¿Cómo escribo un bucle en ruby para poder ejecutar un bloque de código en cada archivo?
Soy nuevo en Ruby, y he llegado a la conclusión de que la forma de hacerlo es hacer cada ciclo.
El archivo ruby se ejecutará desde un directorio diferente al directorio que quiero recorrer.
He probado el Dir.foreach
y no pude hacerlo funcionar.
Como han dicho otros, Dir.foreach
es una buena opción aquí. Sin embargo, tenga en cuenta que Dir.entries
y Dir.foreach
siempre se mostrarán .
y ..
(los directorios actual y padre). Por lo general, no querrá trabajar en ellos, por lo que 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 muestran todos los elementos en el directorio, tanto ocultos como no ocultos. A menudo, esto es lo que desea, pero si no lo es, debe hacer algo para omitir los archivos y directorios ocultos.
De forma alternativa, es posible que desee buscar en Dir.glob
que proporciona una coincidencia de comodín simple:
Dir.glob(''/path/to/dir/*.rb'') do |rb_file|
# do work on files ending in .rb in the desired directory
end
Dir también tiene una 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
Este es mi método favorito para ser fácil de leer:
Dir.glob("*/*.txt") do |my_text_file|
puts "working on: #{my_text_file}..."
end
E incluso puede extender esto para trabajar en todos los archivos en subdirectorios:
Dir.glob("**/*.txt") do |my_text_file| # note one extra "*"
puts "working on: #{my_text_file}..."
end
La biblioteca de búsqueda está diseñada específicamente para esta tarea: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
require ''find''
Find.find(path) do |file|
# process
end
Esta es una biblioteca estándar de rubíes, por lo que debería estar disponible
Me gusta este, que no se ha mencionado anteriormente.
require ''pathname''
Pathname.new(''/my/dir'').children.each do |path|
puts path
end
La ventaja es que obtiene un objeto de nombre de ruta en lugar de una cadena, con el que puede hacer cosas útiles y seguir avanzando.
Dir.foreach("/home/mydir") do |fname|
puts fname
end
Dir.new(''/my/dir'').each do |name|
...
end