Obtener una lista de carpetas en un directorio
¿Cómo obtengo una lista de las carpetas que existen en un determinado directorio con ruby?
Dir.entries()
parece cercano, pero no se como limitar a carpetas solamente.
12 answers
Jordania está cerca, pero Dir.entries
no devuelve el camino completo que File.directory?
espera. Prueba esto:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 20:53:24
He encontrado 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 recurrir carpetas simplemente use **
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 13:06:37
En mi opinión, Pathname
es mucho más adecuado para nombres de archivo que para 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 cadenas
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Si directory_name
era absoluto, estas cadenas también lo son.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 20:55:24
Buscar recursivamente todas las carpetas bajo un determinado directorio:
Dir.glob 'certain_directory/**/*/'
Versión no recursiva:
Dir.glob 'certain_directory/*/'
Nota: Dir.[]
funciona como Dir.glob
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 20:54:01
Puede usar File.directory?
desde el módulo FileTest
para averiguar si un archivo es un directorio. Combinar esto con Dir.entries
hace que sea un buen (ish)-liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}
Editar: Actualizado por la corrección de ScottD.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-14 06:06:39
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-14 09:05:24
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 18:16:56
$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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-15 10:58:52
Creo que puede probar cada archivo para ver si es un directorio con FileTest.directory? (file_name)
. Vea la documentación de FileTest para más información.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 20:56:42
Para una solución genérica es probable que desee utilizar
Dir.glob(File.expand_path(path))
Esto funcionará con rutas como ~/*/
(todas las carpetas dentro de su directorio personal).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-25 15:12:39
Podemos combinar la respuesta de Borh y la respuesta de johannes para obtener una solución bastante elegante para obtener los nombres de los directorios 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 }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 04:10:06
Solo carpetas (".' y '.."se excluyen):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Carpetas y archivos:
Dir.glob(File.join(path, "*"))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-26 11:17:27