Comment obtenir une liste des dossiers qui existent dans un certain répertoire avec ruby?
Dir.entries()
semble proche mais je ne sais pas comment limiter uniquement les dossiers.
Comment obtenir une liste des dossiers qui existent dans un certain répertoire avec ruby?
Dir.entries()
semble proche mais je ne sais pas comment limiter uniquement les dossiers.
Réponses:
Jordan est proche, mais Dir.entries
ne retourne pas le chemin complet File.directory?
attendu. Essaye ça:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.
Dir.glob()
que l'on voit dans l'autre réponse - je recommande fortement de le faire au lieu de cela
J'ai trouvé cela plus utile et plus facile à utiliser:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
il obtient tous les dossiers du répertoire courant, exclus .
et ..
.
Pour récurer les dossiers, utilisez simplement **
à la place de *
.
La Dir.glob
ligne peut également être passée Dir.chdir
sous forme de bloc:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
à la place de *
.
À mon avis, il Pathname
est beaucoup mieux adapté aux 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 de ce répertoire en tant qu'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
c'était absolu, ces chaînes sont également absolues.
Pathname
est qu'il supprime automatiquement .
, ..
et les fichiers propriétaires comme.DS_Store
Trouvez récursivement tous les dossiers dans un certain répertoire:
Dir.glob 'certain_directory/**/*/'
Version non récursive:
Dir.glob 'certain_directory/*/'
Remarque: Dir.[]
fonctionne comme Dir.glob
.
Vous pouvez utiliser à File.directory?
partir du FileTest
module pour savoir si un fichier est un répertoire. Combiner cela avec Dir.entries
fait une belle doublure (ish):
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Edit: mis à jour par la correction de ScottD.
Avec celui - ci, vous pouvez obtenir le tableau d'un chemin d' accès complet à vos répertoires , sous - répertoires , subsubdirectories de manière récursive. J'ai utilisé ce code pour charger ces fichiers avec impatience dans le config/application
fichier.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
En outre , nous ne avons pas besoin traitons le ennuyeux .
et ..
plus. La réponse acceptée était nécessaire pour y faire face.
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
reject !
,select
$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 que vous souhaitez probablement utiliser
Dir.glob(File.expand_path(path))
Cela fonctionnera avec des chemins comme ~/*/
(tous les dossiers de votre répertoire personnel).
Nous pouvons combiner la réponse de Borh et la réponse de 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 }
Je pense que vous pouvez tester chaque fichier pour voir s'il s'agit d'un répertoire avec FileTest.directory? (file_name)
. Consultez la documentation de FileTest pour plus d'informations.
'.'
(répertoire courant) et'..'
(parent du répertoire courant). Dans la plupart des cas, vous souhaitez supprimer au moins ces deux.