ruby filesystems recursion

One-liner para enumerar recursivamente directorios en Ruby?



filesystems recursion (9)

Fast one liner

Solo directorios

`find -type d`.split("/n")

Directorios y archivos normales

`find -type d -or -type f`.split("/n")`

Puro hermoso rubí

require "pathname" def rec_path(path, file= false) puts path path.children.collect do |child| if file and child.file? child elsif child.directory? rec_path(child, file) + [child] end end.select { |x| x }.flatten(1) end # only directories rec_path(Pathname.new(dir), false) # directories and normal files rec_path(Pathname.new(dir), true)

¿Cuál es la forma más rápida, más optimizada y única de obtener una matriz de directorios (excluyendo archivos) en Ruby?

¿Qué hay de incluir archivos?


Aquí hay un ejemplo que combina el descubrimiento dinámico de un directorio de proyecto de Rails con Dir.glob:

dir = Dir.glob(Rails.root.join(''app'', ''assets'', ''stylesheets'', ''*''))


Aunque no es una solución de una línea, creo que esta es la mejor manera de hacerlo con llamadas ruby.

Primero borre todos los archivos recursivamente
Segundo borre todos los directorios vacíos

Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file } Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }


Como se señala en otras respuestas aquí, puede usar Dir.glob . Tenga en cuenta que las carpetas pueden tener muchos caracteres extraños y los argumentos globales son patrones, por lo que algunos personajes tienen un significado especial. Como tal, no es seguro hacer algo como lo siguiente:

Dir.glob("#{folder}/**/*")

En lugar de hacer:

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }


Creo que ninguna de las soluciones aquí trata con directorios ocultos (por ejemplo, ''.test''):

require ''find'' Find.find(''.'') { |e| puts e if File.directory?(e) }


En PHP u otros lenguajes para obtener el contenido de un directorio y todos sus subdirectorios, debe escribir algunas líneas de código, pero en Ruby toma 2 líneas:

require ''find'' Find.find(''./'') do |f| p f end

esto imprimirá el contenido del directorio actual y todos sus subdirectorios.

O más corto, puede usar la notación ''**'' :

p Dir[''**/*.*'']

¿Cuántas líneas escribirá en PHP o en Java para obtener el mismo resultado?


Para la lista de directorios intente

Dir[''**/'']

La lista de archivos es más difícil, porque en el directorio de Unix también se encuentra un archivo, por lo que debe probar el tipo o eliminar entradas de la lista devuelta que sea principal de otras entradas.

Dir[''**/*''].reject {|fn| File.directory?(fn) }

Y para la lista de todos los archivos y directorios simplemente

Dir[''**/*'']


Dir.glob("**/*/") # for directories Dir.glob("**/*") # for all files

En lugar de Dir.glob(foo) , también puede escribir Dir[foo] (sin embargo, Dir.glob también puede tomar un bloque, en cuyo caso producirá cada ruta en lugar de crear una matriz).

Ruby Glob Docs


Dir.open(Dir.pwd).map { |h| (File.file?(h) ? "#{h} - file" : "#{h} - folder") if h[0] != ''.'' }

los puntos vuelven nulos, usan compactos