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.
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 == '..') }
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
À 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.
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
.
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
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.
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.
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).
$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
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
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.
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 }