Wie erhalte ich eine Liste der Ordner, die in einem bestimmten Verzeichnis mit Ruby vorhanden sind?
Dir.entries()
sieht genau aus, aber ich weiß nicht, wie ich mich nur auf Ordner beschränken soll.
Wie erhalte ich eine Liste der Ordner, die in einem bestimmten Verzeichnis mit Ruby vorhanden sind?
Dir.entries()
sieht genau aus, aber ich weiß nicht, wie ich mich nur auf Ordner beschränken soll.
Antworten:
Jordan ist nah dran, gibt aber Dir.entries
nicht den vollen Weg zurück, den man File.directory?
erwartet. Versuche dies:
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()
in der anderen Antwort zu sehen - ich würde dringend empfehlen, dies stattdessen zu tun
Ich fand das nützlicher und benutzerfreundlicher:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
Es werden alle Ordner im aktuellen Verzeichnis abgerufen, ausgeschlossen .
und ..
.
Um Ordner zu rekursieren, verwenden Sie einfach **
anstelle von *
.
Die Dir.glob
Zeile kann auch Dir.chdir
als Block übergeben werden:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
anstelle von verwenden *
.
Meiner Meinung nach Pathname
ist es für Dateinamen viel besser geeignet als für einfache Zeichenfolgen.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Dadurch erhalten Sie ein Array aller Verzeichnisse in diesem Verzeichnis als Pfadnamenobjekte.
Wenn Sie Zeichenfolgen haben möchten
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Wenn directory_name
absolut, sind diese Zeichenfolgen auch absolut.
Pathname
ist , dass es automatisch entfernt .
, ..
und proprietery Dateien wie.DS_Store
Suchen Sie rekursiv alle Ordner in einem bestimmten Verzeichnis:
Dir.glob 'certain_directory/**/*/'
Nicht rekursive Version:
Dir.glob 'certain_directory/*/'
Hinweis: Dir.[]
funktioniert wie Dir.glob
.
Sie können anhand File.directory?
des FileTest
Moduls herausfinden, ob eine Datei ein Verzeichnis ist. Die Kombination mit Dir.entries
ergibt einen schönen (ish) -Liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Bearbeiten: Aktualisiert gemäß ScottD-Korrektur.
Mit diesem können Sie das Array eines vollständigen Pfads zu Ihren Verzeichnissen , Unterverzeichnissen und Unterverzeichnissen auf rekursive Weise abrufen . Ich habe diesen Code verwendet, um diese Dateien eifrig in die config/application
Datei zu laden .
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Darüber hinaus brauchen wir nicht mit den langweiligen beschäftigen .
und ..
mehr. Die akzeptierte Antwort musste sich mit ihnen befassen.
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
Für eine generische Lösung möchten Sie wahrscheinlich verwenden
Dir.glob(File.expand_path(path))
Dies funktioniert mit Pfaden wie ~/*/
(alle Ordner in Ihrem Home-Verzeichnis).
Wir können kombinieren Born Antwort und johannes' Antwort zu bekommen recht eine elegante Lösung zu bekommen , die Verzeichnisnamen in einem Ordner.
# 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 }
Ich denke, Sie können jede Datei testen, um festzustellen, ob es sich um ein Verzeichnis mit handelt FileTest.directory? (file_name)
. Weitere Informationen finden Sie in der Dokumentation zu FileTest .
'.'
(aktuelles Verzeichnis) und'..'
(übergeordnetes Verzeichnis des aktuellen Verzeichnisses). In den meisten Fällen möchten Sie mindestens diese beiden entfernen.