Wie schreibe ich eine Schleife in Ruby, damit ich für jede Datei einen Codeblock ausführen kann?
Ich bin neu in Ruby und bin zu dem Schluss gekommen, dass der Weg, dies zu tun, darin besteht, jede Schleife zu machen.
Die Ruby-Datei wird aus einem anderen Verzeichnis als dem Verzeichnis ausgeführt, das ich durchlaufen möchte.
Ich habe es versucht Dir.foreach
und konnte es nicht zum Laufen bringen.
ruby
directory
filesystems
Andrew
quelle
quelle
Dir.foreach
arbeitet, um über den Inhalt eines Verzeichnisses zu iterieren, so dass etwas anderes viel los ist.do_something_with(entry) if File.file?(entry)
'img/*.{jpg,png,gif,jpeg}'
diese Option, um mehrere Erweiterungen abzurufen.Antworten:
Wie andere gesagt haben,
Dir::foreach
ist hier eine gute Option. Beachten Sie jedoch, dassDir::foreach
undDir::entries
immer.
und..
(das aktuelle und das übergeordnete Verzeichnis) enthalten sind. Sie werden im Allgemeinen nicht daran arbeiten wollen, also können SieDir::each_child
oderDir::children
(wie von ma11hew28 vorgeschlagen ) verwenden oder so etwas tun:Dir::foreach
undDir::entries
(sowieDir::each_child
undDir::children
) enthalten auch versteckte Dateien und Verzeichnisse. Oft ist es das, was Sie wollen, aber wenn dies nicht der Fall ist, müssen Sie etwas tun, um sie zu überspringen.Alternativ können Sie sich ansehen,
Dir::glob
welche einfache Platzhalterübereinstimmung bietet:quelle
Dir.foreach
diese Option, wenn das Verzeichnis eine große Anzahl von Dateien enthält!next if File.directory? item
.
oder..
weil die Leute diese beiden fast immer ignorieren wollen, zu vermeiden .Dir.foreach
iteriert, anstatt ein (möglicherweise riesiges) Array im Voraus aufzubauen (was derDir.glob
Fall ist). Wenn das Verzeichnis also wirklich riesig ist, kann dies einen Leistungsunterschied bewirken. Unter normalen Umständen würden Sie es nicht bemerken, aber unter Stressbedingungen kann es absolut wichtig sein.Dies ist meine Lieblingsmethode, um leicht zu lesen:
Und Sie können dies sogar erweitern, um alle Dateien in Unterverzeichnissen zu bearbeiten:
quelle
Dir hat auch eine kürzere Syntax, um ein Array aller Dateien aus dem Verzeichnis abzurufen:
quelle
fname
Iterationen verwendet werden?quelle
Die Suchbibliothek wurde speziell für diese Aufgabe entwickelt: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
Dies ist eine Standard-Ruby-Bibliothek, daher sollte sie verfügbar sein
quelle
File.find
geht rekursiv so weit wie möglich nach unten, beginnend mit dem Pfad, den Sie ihm geben. Ich bin mir nicht sicher, ob das OP das will.*.rb
zu übergebenfind()
Ich mag dieses, das oben nicht erwähnt wurde.
Der Vorteil ist, dass Sie anstelle einer Zeichenfolge ein Pfadnamenobjekt erhalten, mit dem Sie nützliche Dinge tun und weiter durchlaufen können.
quelle
quelle
Dir.foreach
Iteriert auch, währendDir.entries
das gesamte Array auf einmal aufgebaut wird. Wenn das Verzeichnis also immens ist, ist es weniger ein Speicher-Hit. (Normalerweise keine große Sache, wahrscheinlich, aber immer noch ...)Zum Überspringen von
.
&..
können Sie verwendenDir::each_child
.Dir::children
Gibt ein Array der Dateinamen zurück.quelle