¿Cómo obtengo una lista de las carpetas que existen en un directorio determinado con ruby?
Dir.entries()
parece cercano pero no sé cómo limitarlo solo a carpetas.
¿Cómo obtengo una lista de las carpetas que existen en un directorio determinado con ruby?
Dir.entries()
parece cercano pero no sé cómo limitarlo solo a carpetas.
Respuestas:
Jordan está cerca, pero Dir.entries
no devuelve el camino completo que File.directory?
esperaba. Prueba esto:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.
Dir.glob()
como se ve en la otra respuesta; recomiendo encarecidamente hacer eso en lugar de esto
Encontré esto más útil y fácil de usar:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
obtiene todas las carpetas del directorio actual, excluidas .
y ..
.
Para carpetas recurrentes, simplemente use **
en lugar de *
.
La Dir.glob
línea también se puede pasar Dir.chdir
como un bloque:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
en lugar de *
.
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 da 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
fuera absoluto, estas cadenas también lo son.
Pathname
es que elimina de forma automática .
, ..
y los archivos como proprietery.DS_Store
Busque de forma recursiva 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
.
Puede utilizar File.directory?
desde elFileTest
módulo para averiguar si un archivo es un directorio. La combinación de esto con Dir.entries
hace que sea agradable (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Editar: actualizado según la corrección de ScottD.
Con este, puede obtener la matriz de una ruta completa a sus directorios , subdirectorios , subsubdirectorios de forma recursiva. Usé ese código para cargar ansiosamente estos archivos dentro del config/application
archivo.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Además, no necesitamos lidiar con lo aburrido .
y ..
más. La respuesta aceptada necesitaba lidiar con ellos.
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
reject !
,select
$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 que probablemente desee utilizar
Dir.glob(File.expand_path(path))
Esto funcionará con rutas como ~/*/
(todas las carpetas dentro de su directorio personal).
Podemos combinar la respuesta de Borh y respuesta de Johannes 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 }
Creo que puede probar cada archivo para ver si es un directorio con FileTest.directory? (file_name)
. Consulte la documentación de FileTest para obtener más información.
'.'
(directorio actual) y'..'
(padre del directorio actual). En la mayoría de los casos, desea eliminar al menos esos dos.