Pregunta

¿Cómo obtengo una lista de las carpetas que existen en un determinado directorio con Ruby?

Dir.entries() Parece cercano, pero no sé cómo limitarlo solo a carpetas.

¿Fue útil?

Solución

Jordan está cerca, pero Dir.entries no devuelve la ruta completa que File.directory? Espera. Prueba esto:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }

Otros consejos

He encontrado este más útil y fácil de usar:

Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}

se pone todas las carpetas en el directorio actual, . excluidos y ...

Para recursivos carpetas simplemente usan ** en lugar de *.

La línea Dir.glob también se puede pasar a Dir.chdir como un bloque:

Dir.chdir('/destination directory') do
  Dir.glob('*').select { |f| File.directory? f }
end

En mi opinión Pathname es mucho más adecuado para los nombres de archivo que las cadenas sin formato.

require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }

Esto le da una gran variedad de todos los directorios en ese directorio como objetos rutas de directorios.

Si usted quiere tener cadenas

Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }

Si directory_name era absoluta, estas cadenas son absolutos también.

recursiva encontrar todas las carpetas debajo de un cierto directorio:

Dir.glob 'certain_directory/**/*/'

No-recursiva versión:

Dir.glob 'certain_directory/*/'

Nota:. Dir.[] funciona como Dir.glob

Puede utilizar File.directory? del módulo FileTest para averiguar si un archivo es un directorio. Combinando esto con Dir.entries lo convierte en un buen -liner uno (o menos):

directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}

Editar:. Actualización por la corrección de ScottD

directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}

Con este, puedes obtener la matriz de un ruta completa para usted directorios, subdirectorios, subsubdirectorios de forma recursiva.Utilicé ese código para cargar ansiosamente estos archivos dentro. config/application archivo.

Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }

Además, no necesitamos lidiar con lo aburrido. . y .. ya no.La respuesta aceptada necesitaba lidiar con ellos.

Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media"

Dir.glob("#{$dir_target}/**/*").each do |f| 
  if File.directory?(f)
    puts "#{f}\n"
  end
end

Para una solución genérica es probable que desee utilizar

Dir.glob(File.expand_path(path))

Esto funciona con senderos como ~/*/ (todas las carpetas dentro de su directorio personal).

Sólo las carpetas (y '..' están excluidos ''):

Dir.glob(File.join(path, "*", File::SEPARATOR))

Las carpetas y archivos:

Dir.glob(File.join(path, "*"))

Creo que se puede probar cada archivo para ver si se trata de un directorio con FileTest.directory? (file_name). Ver la documentación para FileTest para obtener más información.

Podemos combinar respuesta de Borh y Johannes respuesta a conseguir absolutamente una solución elegante para obtener los nombres de directorio en una carpeta.

# user globbing to get a list of directories for a path
base_dir_path = ''
directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))

# or recursive version:
directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', ''))

# cast to Pathname
directories = directory_paths.collect {|path| Pathname.new(path) }

# return the basename of the directories
directory_names = directories.collect {|dir| dir.basename.to_s }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top