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.

Author: Nietzche-jou, 2009-12-14

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 == '..') }
 62
Author: 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
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
 91
Author: Emiliano Poggi,
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.

 41
Author: johannes,
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.

 18
Author: Bohr,
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.

 4
Author: Jordan Running,
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)}
 4
Author: Markus,
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)}
 1
Author: msangui,
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
 1
Author: David Douglas,
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.

 0
Author: matekm,
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).

 0
Author: thisismydesign,
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 }
 0
Author: br3nt,
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, "*"))

 0
Author: Iwan B.,
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