Was ist der schnellste, optimierteste und einzeiligste Weg, um ein Array der Verzeichnisse (ohne Dateien) in Ruby abzurufen?
Wie wäre es mit Dateien?
Was ist der schnellste, optimierteste und einzeiligste Weg, um ein Array der Verzeichnisse (ohne Dateien) in Ruby abzurufen?
Wie wäre es mit Dateien?
Antworten:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Anstelle von können Dir.glob(foo)
Sie auch schreiben Dir[foo]
( Dir.glob
kann aber auch einen Block nehmen, in welchem Fall es jeden Pfad ergibt, anstatt ein Array zu erstellen).
Dir.glob("**/")
Sie, es sei denn, Sie möchten auch Symlinks
File::FNM_DOTMATCH
Flag, um Punktedateien in die Übereinstimmungsergebnisse aufzunehmen .
Dir.glob("**/*", File::FNM_DOTMATCH)
Ich glaube, keine der Lösungen hier befasst sich mit versteckten Verzeichnissen (zB '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
War hilfreich für mich
Für eine Liste der Verzeichnisse versuchen Sie
Dir['**/']
Die Liste der Dateien ist schwieriger, da im Unix-Verzeichnis auch eine Datei vorhanden ist. Sie müssen daher den Typ testen oder Einträge aus der zurückgegebenen Liste entfernen, die anderen Einträgen übergeordnet 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)
end.select {}.flatten()
Teil erklären ? Ich mag die Funktion insgesamt. Es sieht so aus, als würde dadurch ein Array von Arrays erstellt. Wäre es möglich, den elseif
Teil mit: zu machen, rec_path(child, file) << child.to_s
damit Sie ihn einem Array zuweisen und ein Array von Zeichenfolgen erhalten können? Vielen Dank!
Wie in anderen Antworten hier angegeben, können Sie verwenden Dir.glob
. Beachten Sie, dass Ordner viele seltsame Zeichen enthalten können und Glob-Argumente Muster sind, sodass einige Zeichen eine besondere Bedeutung haben. Daher ist es unsicher, Folgendes zu tun:
Dir.glob("#{folder}/**/*")
Tun Sie stattdessen:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
In PHP oder anderen Sprachen müssen Sie einige Codezeilen schreiben, um den Inhalt eines Verzeichnisses und aller seiner Unterverzeichnisse abzurufen. In Ruby sind jedoch zwei Zeilen erforderlich:
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 verwenden:
p Dir['**/*.*']
Wie viele Zeilen werden Sie in PHP oder Java schreiben, um das gleiche Ergebnis zu erzielen?
Obwohl dies keine einzeilige Lösung ist, denke ich, dass dies der beste Weg ist, dies mit Ruby-Anrufen zu tun.
Löschen Sie zuerst 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) }
Hier ist ein Beispiel, das die dynamische Erkennung eines Rails-Projektverzeichnisses mit Dir.glob kombiniert:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, konnte aber immer noch die Unterordner und Dateien im Assets-Ordner vonRails.application.config.assets.paths