it-swarm.com.de

Abrufen einer Liste von Ordnern in einem Verzeichnis

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

Dir.entries() sieht nah aus, aber ich weiß nicht, wie ich mich auf Ordner beschränken soll.

76
0xC0DEFACE

Jordan ist nahe, aber Dir.entries gibt nicht den vollständigen Pfad zurück, den File.directory? erwartet. Versuche dies:

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

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, . und .. ausgeschlossen.

Um Ordner erneut aufzurufen, verwenden Sie einfach ** anstelle von *.

Die Dir.glob-Zeile kann auch als Block an Dir.chdir übergeben werden: 

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

Meiner Meinung nach ist Pathname für Dateinamen viel besser geeignet als 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 du Strings haben willst

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

Wenn directory_name absolut war, sind auch diese Zeichenfolgen absolut.

43
johannes

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.

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

Sie können File.directory? aus dem Modul FileTest verwenden, um herauszufinden, ob eine Datei ein Verzeichnis ist. Wenn Sie dies mit Dir.entries kombinieren, erhalten Sie einen Nice (ish) -liner:

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

Edit: Pro ScottDs Korrektur aktualisiert.

4
Jordan Running

Mit diesem können Sie das Array eines vollständiger Pfad zu Ihren Verzeichnissen , Unterverzeichnisse , Unterverzeichnisse auf rekursive Weise. Ich habe diesen Code benutzt, um diese Dateien eifrig in die Datei config/application zu laden.

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

Außerdem müssen wir uns nicht mehr mit dem langweiligen . und .. auseinandersetzen. Die akzeptierte Antwort musste sich mit ihnen befassen.

2
Victor

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

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

Ordner und Dateien:

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

1
Iwan B.

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 Heimatverzeichnis).

1
thisismydesign
$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
1
David Douglas
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
1
msangui

Ich denke, Sie können jede Datei testen, um zu sehen, ob es ein Verzeichnis mit FileTest.directory? (file_name) ist. In der Dokumentation zu FileTest finden Sie weitere Informationen.

0
matekm

Wir können Antwort von Borh und Antwort von Johannes kombinieren, um eine ziemlich elegante Lösung für das Abrufen der Verzeichnisnamen in einem Ordner zu erhalten.

# 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 }
0
br3nt