web-dev-qa-db-fra.com

Obtenir une liste de dossiers dans un répertoire

Comment puis-je obtenir une liste des dossiers qui existent dans un certain répertoire avec Ruby?

Dir.entries() semble proche mais je ne sais pas comment me limiter aux dossiers.

76
0xC0DEFACE

Jordan est proche, mais Dir.entries ne renvoie pas le chemin complet attendu par File.directory?. Essaye ça:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
63
scottd

J'ai trouvé cela plus utile et facile à utiliser:

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

tous les dossiers du répertoire en cours, à l'exception de . et .., sont exclus.

Pour recister des dossiers, utilisez simplement ** à la place de *.

La ligne Dir.glob peut également être passée à Dir.chdir en tant que bloc: 

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

À mon avis, Pathname convient beaucoup mieux aux noms de fichiers qu'aux chaînes ordinaires.

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

Cela vous donne un tableau de tous les répertoires de ce répertoire sous forme d'objets Pathname.

Si vous voulez avoir des ficelles

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

Si directory_name était absolu, ces chaînes le sont également.

43
johannes

Rechercher récursivement tous les dossiers sous un certain répertoire:

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

Version non récursive:

Dir.glob 'certain_directory/*/'

Remarque: Dir.[] fonctionne comme Dir.glob.

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

Vous pouvez utiliser File.directory? à partir du module FileTest pour savoir si un fichier est un répertoire. En combinant ceci avec Dir.entries, on obtient un joli liner (ish):

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

Edit: Mis à jour selon la correction de ScottD.

4
Jordan Running

Avec celui-ci, vous pouvez obtenir le tableau d'un chemin complet vers vos répertoires , sous-répertoires , sous-répertoires de manière récursive. J'ai utilisé ce code pour charger ces fichiers dans le fichier config/application.

Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }

De plus, nous n'avons plus besoin de nous occuper des ennuyeux . et ... La réponse acceptée devait traiter avec eux.

2
Victor

Pour une solution générique, vous voudrez probablement utiliser

Dir.glob(File.expand_path(path))

Cela fonctionnera avec des chemins tels que ~/*/ (tous les dossiers de votre répertoire personnel).

1
thisismydesign
$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
David Douglas
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
1
msangui

Je pense que vous pouvez tester chaque fichier pour voir s’il s’agit d’un répertoire avec FileTest.directory? (file_name). Voir la documentation de FileTest pour plus d’informations.

0
matekm

Nous pouvons combiner la réponse de Borh et la réponse de johannes pour obtenir une solution assez élégante pour obtenir les noms de répertoire dans un dossier.

# 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
br3nt