Frage

Wie bekomme ich eine Liste der Ordner, die mit Ruby in einem bestimmten Verzeichnis existieren?

Dir.entries() Aussehen der Nähe, aber ich weiß nicht, wie man Grenze nur für Ordner.

War es hilfreich?

Lösung

Jordan ist in der Nähe, aber Dir.entries kehrt nicht den vollständigen Pfad dass File.directory? erwartet. Versuchen Sie folgendes:

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

Andere Tipps

Ich habe dies nützlich gefunden und einfach zu bedienen:

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

es wird alle Ordner im aktuellen Verzeichnis, ausgeschlossen . und ...

Um Rekursion Ordner einfach ** anstelle von * verwenden.

Die Dir.glob Linie kann auch auf Dir.chdir als Block übergeben werden:

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

Meiner Meinung nach Pathname ist viel besser geeignet für Dateinamen als einfache Zeichenfolgen.

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

Das gibt Ihnen einen Array aller Verzeichnisse in diesem Verzeichnis als Pathname Objekte.

Wenn Sie Strings haben

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

Wenn directory_name absolute war, sind diese Saiten absolut zu.

Recursively alle Ordner unter einem bestimmten Verzeichnis finden:

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

Nicht-rekursive Version:

Dir.glob 'certain_directory/*/'

. Hinweis: Dir.[] funktioniert wie Dir.glob

Sie können File.directory? vom FileTest Modul verwenden, um herauszufinden, ob eine Datei ein Verzeichnis ist. In Kombination mit Dir.entries macht für einen netten (ish) -Liner:

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

Edit:. Aktualisiert pro ScottD der Korrektur

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

Mit diesem können Sie die Anordnung einer vollständigen Pfad erhalten , um Ihre Verzeichnisse Unterverzeichnisse subsubdirectories in einer rekursiven Weise. Ich habe diesen Code zu eifrig Last diese Dateien innerhalb config/application Datei.

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

Darüber hinaus Wir müssen mehr mit dem langweiligen . und .. nicht beschäftigen. Die akzeptierte Antwort benötigt, um mit ihnen fertig zu werden.

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

Für eine generische Lösung, die Sie wahrscheinlich verwenden möchten

Dir.glob(File.expand_path(path))

Dies wird mit Pfaden wie ~/*/ arbeitet (alle Ordner in Ihrem Home-Verzeichnis).

Nur Ordner (und '..' sind ausgeschlossen ''):

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

Ordner und Dateien:

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

Ich glaube, Sie jede Datei testen, um zu sehen, ob es ein Verzeichnis mit FileTest.directory? (file_name) ist. Siehe die Dokumentation für Filetest für weitere Informationen.

Wir kombinieren Born Antwort und johannes' Antwort recht eine elegante Lösung zu bekommen, um die Verzeichnisnamen in einem Ordner zu bekommen.

# 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 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top