Was ist die schnellste, optimierte und einzeilige Methode, um ein Array der Verzeichnisse (ohne Dateien) in Ruby abzurufen?
Wie wäre es mit Dateien?
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Anstelle von Dir.glob(foo)
können Sie auch Dir[foo]
Schreiben (Dir.glob
Kann jedoch auch einen Block enthalten, in diesem Fall wird jeder Pfad ausgegeben, anstatt ein Array zu erstellen).
Ich glaube, keine der Lösungen hier befasst sich mit versteckten Verzeichnissen (z. B. '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Für eine Liste der Verzeichnisse versuchen
Dir['**/']
Die Liste der Dateien ist schwieriger, da das Unix-Verzeichnis auch eine Datei ist. Sie müssen daher prüfen, ob Einträge eingegeben oder aus der zurückgegebenen Liste entfernt werden, die übergeordnet zu anderen Einträgen ist.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Und für die Liste aller Dateien und Verzeichnisse einfach
Dir['**/*']
Nur Verzeichnisse
`find -type d`.split("\n")
Verzeichnisse und normale Dateien
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
Wie bereits in anderen Antworten erwähnt, können Sie Dir.glob
. Denken Sie daran, dass Ordner viele seltsame Zeichen enthalten können und Glob-Argumente Muster sind, sodass einige Zeichen eine besondere Bedeutung haben. Daher ist es nicht sicher, Folgendes zu tun:
Dir.glob("#{folder}/**/*")
Mach stattdessen:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
In PHP oder anderen Sprachen, um den Inhalt eines Verzeichnisses und aller seiner Unterverzeichnisse zu erhalten, müssen Sie einige Codezeilen schreiben, aber in Ruby benötigt es 2 Linien:
require 'find'
Find.find('./') do |f| p f end
dadurch wird der Inhalt des aktuellen Verzeichnisses und aller seiner Unterverzeichnisse gedruckt.
Oder kürzer, Sie können die ’**’
Notation:
p Dir['**/*.*']
Wie viele Zeilen werden Sie in PHP oder in Java schreiben, um das gleiche Ergebnis zu erhalten?
Hier ist ein Beispiel, das die dynamische Ermittlung eines Rails Projektverzeichnisses mit Dir.glob kombiniert:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
Obwohl dies keine einzeilige Lösung ist, ist dies meiner Meinung nach der beste Weg, dies mit Ruby - Aufrufen zu tun.
Löschen Sie zunächst alle Dateien rekursiv
Zweitens löschen Sie alle leeren Verzeichnisse
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }