¿Cómo escribo un bucle en ruby para poder ejecutar un bloque de código en cada archivo?
Soy nuevo en Ruby, y he concluido que la forma de hacerlo es hacer cada ciclo.
El archivo ruby se ejecutará desde un directorio diferente al directorio que quiero recorrer.
Lo intenté Dir.foreachy no pude hacerlo funcionar.
ruby
directory
filesystems
Andrés
fuente
fuente

Dir.foreachfunciona para iterar sobre el contenido de un directorio, por lo que algo más está sucediendo.do_something_with(entry) if File.file?(entry)'img/*.{jpg,png,gif,jpeg}'para tomar múltiples extensiones.Respuestas:
Como han dicho otros,
Dir::foreaches una buena opción aquí. Sin embargo, tenga en cuenta queDir::foreachyDir::entriessiempre incluirá.y..(los directorios actual y principal). Por lo general, no querrá trabajar en ellos, por lo que puede usarDir::each_childoDir::children(como lo sugiere ma11hew28 ) o hacer algo como esto:Dir::foreachyDir::entries(así comoDir::each_childyDir::children) también incluyen archivos y directorios ocultos. A menudo, esto es lo que desea, pero si no lo es, debe hacer algo para saltearlos.Alternativamente, es posible que desee investigar
Dir::globqué proporciona una coincidencia de comodines simple:fuente
Dir.foreachsi el directorio contiene una gran cantidad de archivos!next if File.directory? item.o..porque la gente casi siempre quiere ignorar esos dos.Dir.foreachitera en lugar de construir una matriz (potencialmente enorme) por adelantado (lo queDir.globhace). Entonces, si el directorio es realmente enorme, puede hacer una diferencia de rendimiento. En circunstancias normales no lo notarías, pero en condiciones de estrés, puede ser absolutamente importante.Este es mi método favorito para ser fácil de leer:
E incluso puede extender esto para trabajar en todos los archivos en subdirectorios:
fuente
Dir también tiene una sintaxis más corta para obtener una matriz de todos los archivos del directorio:
fuente
fnamelas iteraciones?fuente
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
Esta es una biblioteca estándar de ruby, por lo que debería estar disponible
fuente
File.findbaja recursivamente tanto como sea posible, comenzando por cualquier camino que le des. No estoy seguro de que eso sea lo que quiere el OP.*.rbafind()Me gusta este, que no se ha mencionado anteriormente.
El beneficio es que obtienes un objeto Pathname en lugar de una cadena, con el que puedes hacer cosas útiles y recorrer más.
fuente
fuente
Dir.foreachitera mientrasDir.entriesconstruye toda la matriz a la vez. Entonces, si el directorio es inmenso, es menos un golpe de memoria. (No suele ser un gran problema, probablemente, pero aún así ...)Para omitir
.&.., puede usarDir::each_child.Dir::childrendevuelve una matriz de los nombres de archivo.fuente