¿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.foreach
y no pude hacerlo funcionar.
ruby
directory
filesystems
Andrés
fuente
fuente
Dir.foreach
funciona 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::foreach
es una buena opción aquí. Sin embargo, tenga en cuenta queDir::foreach
yDir::entries
siempre incluirá.
y..
(los directorios actual y principal). Por lo general, no querrá trabajar en ellos, por lo que puede usarDir::each_child
oDir::children
(como lo sugiere ma11hew28 ) o hacer algo como esto:Dir::foreach
yDir::entries
(así comoDir::each_child
yDir::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::glob
qué proporciona una coincidencia de comodines simple:fuente
Dir.foreach
si el directorio contiene una gran cantidad de archivos!next if File.directory? item
.
o..
porque la gente casi siempre quiere ignorar esos dos.Dir.foreach
itera en lugar de construir una matriz (potencialmente enorme) por adelantado (lo queDir.glob
hace). 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
fname
las 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.find
baja recursivamente tanto como sea posible, comenzando por cualquier camino que le des. No estoy seguro de que eso sea lo que quiere el OP.*.rb
afind()
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.foreach
itera mientrasDir.entries
construye 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::children
devuelve una matriz de los nombres de archivo.fuente