Obtener una lista de carpetas en un directorio
-
19-09-2019 - |
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.
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 }