Obtenir une liste des dossiers dans un répertoire
-
19-09-2019 - |
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.
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 }