Pregunta Obtener una lista de carpetas en un directorio


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

Dir.entries() se ve cerca, pero no sé cómo limitar solo a las carpetas.


73
2017-12-14 05:26


origen


Respuestas:


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 == '..') }

62
2017-12-14 06:02



Lo encontré más útil y fácil de usar:

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

obtiene todas las carpetas en el directorio actual, excluidas . y ...

Para recurse carpetas simplemente use ** en lugar de *.

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

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

90
2018-05-30 20:20



en mi opinión Pathname es mucho más adecuado para nombres de archivo que cadenas simples.

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

Esto le proporciona una matriz de todos los directorios en ese directorio como objetos Pathname.

Si quieres tener cuerdas

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

Si directory_name fue absoluto, estas cadenas también son absolutas.


41
2017-12-14 09:27



Encuentra recursivamente todas las carpetas en un directorio determinado:

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

Versión no recursiva:

Dir.glob 'certain_directory/*/'

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


18
2018-03-18 09:09



Puedes usar File.directory? desde el FileTest módulo para averiguar si un archivo es un directorio. Combinando esto con Dir.entries hace una bonita (ish) -liner:

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

Editar: Actualizado por la corrección de ScottD.


4
2017-12-14 05:34



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

4
2017-12-14 09:05



Dir.glob('/your_dir').reject {|e| !File.directory?(e)}

1
2017-08-26 18:16



$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

1
2018-05-15 10:00