cadenas archivos ruby directory filesystems

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



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