Question

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

Dir.entries() ressemble beaucoup, mais je ne sais pas comment limiter uniquement aux dossiers.

Était-ce utile?

La solution

Jordan est proche, mais Dir.entries ne retourne pas le chemin complet que File.directory? attend. Essayez ceci:

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

Autres conseils

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

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

il obtient tous les dossiers dans le répertoire courant, exclus . et ...

Pour RECURSE dossiers utilisent simplement ** à la place de *.

La ligne de Dir.glob peut également être transmis à Dir.chdir en bloc:

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

Dans mon Pathname d'opinion est beaucoup mieux adapté pour les noms de fichiers que les chaînes simples.

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

Cela vous donne un tableau de tous les répertoires dans ce répertoire comme des objets PathName.

Si vous voulez avoir des chaînes

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

Si directory_name était absolue, ces chaînes sont trop absolue.

trouver récursive tous les dossiers dans un répertoire:

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

Version non récursive:

Dir.glob 'certain_directory/*/'

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

Vous pouvez utiliser File.directory? du module FileTest pour savoir si un fichier est un répertoire. La combinaison de cela avec Dir.entries fait pour une belle un (ish) -liner:

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

Edit:. Mise à jour par la correction de ScottD

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

Avec celui-ci, vous pouvez obtenir le tableau d'un répertoire chemin complet à votre , sous-répertoires , subsubdirectories de manière récursive. Je ce code pour charger ces fichiers à l'intérieur désireux fichier config/application.

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

En outre, nous ne devons pas traiter avec le . ennuyeux et .. plus. La réponse acceptée nécessaire pour traiter avec eux.

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

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

Dir.glob(File.expand_path(path))

Cela fonctionne avec des chemins comme ~/*/ (tous les dossiers dans votre répertoire personnel).

Seuls les dossiers (et '..' sont exclus. »):

Dir.glob(File.join(path, "*", File::SEPARATOR))

Les dossiers et fichiers:

Dir.glob(File.join(path, "*"))

Je pense que vous pouvez tester chaque fichier pour voir si elle est un répertoire avec FileTest.directory? (file_name). Voir la documentation filetest pour plus d'informations.

Nous pouvons combiner réponse de Borh et réponse johannes pour obtenir tout à fait une solution é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 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top