Abrufen einer Liste der Ordner in einem Verzeichnis
-
19-09-2019 - |
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.
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 }