Ich möchte mit Ruby alle Dateinamen aus einem Ordner abrufen.
358
Sie haben auch die Verknüpfungsoption von
Dir["/path/to/search/*"]
und wenn Sie alle Ruby-Dateien in einem Ordner oder Unterordner finden möchten:
Dir["/path/to/search/**/*.rb"]
./...
eher als~/
./
bedeutet das aktuelle Verzeichnis, während/
der Root-Mount-Punkt und~/
das Home-Verzeichnis des Benutzers ist. Wenn Sie das gesamte Projekt an einen anderen Ort verschieben, funktioniert das erste, die beiden anderen wahrscheinlich nicht.Beispiel:
Quelle: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
quelle
Dir#glob
könnte zum Beispiel vielleicht erwähnt worden sein), hindert nichts andere daran, eine wirklich gute Antwort zu veröffentlichen. Natürlich bin ich meistens ein Typ, der "halb voll" ist ...Dir
selten und jedes Mal, wenn ich es brauche, muss ich die Dokumentation lesen. Ich habe meine Frage und Antwort hier gepostet, damit ich sie später finden und vielleicht sogar jemandem mit der gleichen Frage helfen kann. Ich glaube, ich habe bei SO Podcast gehört, dass an einem solchen Verhalten nichts auszusetzen ist. Wenn Sie eine bessere Antwort haben, posten Sie diese bitte. Ich habe gepostet, was ich weiß, ich bin kein Ruby-Ninja. Ich akzeptiere regelmäßig Antworten mit den meisten Stimmen.Dir[]
oderDir.glob
wenn das Argument eine Variable ist. Wennpath = '/tmp'
, zu vergleichen:Dir.glob("#{path}/*")
vsDir.entries(path)
. Die Rückgabewerte unterscheiden sich geringfügig (".", ".."), letzteres ist jedoch auf einen Blick leichter zu erfassen.Die folgenden Schnipsel genau zeigen den Namen der Dateien in einem Verzeichnis, das Überspringen Verzeichnisse und
"."
,".."
gepunkteter Ordner:quelle
...select {|f| File.file? f}
für eine klarere Bedeutung und kürzere Syntax tun .Dir.entries("your/folder").select {|f| File.file? f}
!File.directory?
funktioniert aberFile.file?
nicht..reject {|f| File.directory? f}
scheint sauberer als.select{|f| !File.directory? f}
. Oh, und jetzt sehe ich den ersten Kommentar ... auch gut.So rekursiv alle Dateien (ausschließlich Dateien) abrufen:
Oder alles, was kein Verzeichnis ist (
File.file?
würde nicht reguläre Dateien ablehnen):Alternative Lösung
Die Verwendung
Find#find
einer musterbasierten Suchmethode wieDir.glob
ist eigentlich besser. Siehe diese Antwort auf "Einzeiler zum rekursiven Auflisten von Verzeichnissen in Ruby?" .quelle
Das funktioniert bei mir:
Wenn Sie keine versteckten Dateien [1] möchten, verwenden Sie Dir [] :
Jetzt gibt Dir.entries versteckte Dateien zurück, und Sie benötigen keinen Platzhalter-Stern (Sie können nur die Variable mit dem Verzeichnisnamen übergeben), sondern den Basisnamen direkt zurück, sodass die Funktionen von File.xxx nicht funktionieren .
[1] Unter
.dotfile
Unix weiß ich nichts über Windowsquelle
In Ruby 2.5 können Sie jetzt verwenden
Dir.children
. Es erhält Dateinamen als Array mit Ausnahme von "." und ".."Beispiel:
http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children
quelle
Persönlich fand ich dies am nützlichsten, um Dateien in einem Ordner zu durchlaufen, vorausschauende Sicherheit:
quelle
Dies ist eine Lösung, um Dateien in einem Verzeichnis zu finden:
quelle
Während alle Dateinamen in einem Verzeichnis abgerufen werden, kann dieses Snippet verwendet werden, um sowohl Verzeichnisse [
.
,..
] als auch versteckte Dateien abzulehnen , die mit a beginnen.
quelle
Dir.entries
Gibt lokale Dateinamen zurück, keine absoluten Dateipfade. Erwartet andererseitsFile.directory?
einen absoluten Dateipfad. Dieser Code funktioniert nicht wie erwartet.Dieser Code gibt nur Dateinamen mit ihrer Erweiterung zurück (ohne globalen Pfad).
quelle
Das funktioniert bei mir:
Dir.entries
Gibt ein Array von Zeichenfolgen zurück. Dann müssen wir einen vollständigen Pfad der Datei zuFile.file?
angeben, esdir
sei denn, dies entspricht unserem aktuellen Arbeitsverzeichnis. Deshalb dasFile.join()
.quelle
Möglicherweise möchten Sie auch Folgendes verwenden
Rake::FileList
(vorausgesetzt, Sie haben einerake
Abhängigkeit):Laut API:
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
quelle
Wenn Sie ein Array von Dateinamen einschließlich Symlinks erhalten möchten , verwenden Sie
oder auch
und wenn Sie ohne Symlinks auskommen möchten , verwenden Sie
Verwenden Sie, wie in anderen Antworten gezeigt,
Dir.glob('/path/to/dir/**/*')
anstelle von,Dir.new('/path/to/dir')
wenn Sie alle Dateien rekursiv abrufen möchten.quelle
*.*
quelle
Zusätzlich zu den Vorschlägen in diesem Thread wollte ich erwähnen, dass Sie, wenn Sie auch Punktdateien (.gitignore usw.) zurückgeben müssen, bei Dir.glob ein Flag wie folgt einfügen müssen:
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
Standardmäßig Dir.entries Enthält Punktedateien sowie aktuelle übergeordnete Verzeichnisse.Für alle Interessierten war ich neugierig, wie die Antworten hier im Vergleich zur Ausführungszeit miteinander verglichen wurden, hier waren die Ergebnisse gegen tief verschachtelte Hierarchien. Die ersten drei Ergebnisse sind nicht rekursiv:
Diese wurden mit dem folgenden Benchmarking-Skript generiert:
Die Unterschiede in der
Dir.entries
Anzahl der Dateien sind darauf zurückzuführen, dass standardmäßig ausgeblendete Dateien enthalten sind.Dir.entries
In diesem Fall dauerte es etwas länger, da der absolute Pfad der Datei neu erstellt werden musste, um festzustellen, ob eine Datei ein Verzeichnis war, aber auch ohne dies dauerte es im rekursiven Fall immer noch länger als die anderen Optionen. Dies alles verwendete Ruby 2.5.1 unter OSX.quelle
Ein einfacher Weg könnte sein:
quelle
Gibt die relativen Pfade der Datei aus dem Verzeichnis und allen Unterverzeichnissen zurück
quelle
In einem IRB-Kontext können Sie Folgendes verwenden, um die Dateien im aktuellen Verzeichnis abzurufen:
Sie können diese Funktion auch für andere Verzeichnisse verwenden:
quelle