it-swarm.com.de

Durchlaufen Sie jede Datei in einem Verzeichnis

Wie schreibe ich eine Schleife in Ruby), damit ich für jede Datei einen Codeblock ausführen kann?

Ich bin neu in Ruby, und ich bin zu dem Schluss gekommen, dass der Weg, dies zu tun, eine do each-Schleife ist.
Die Ruby Datei wird aus einem anderen Verzeichnis als dem Verzeichnis ausgeführt, durch das ich eine Schleife durchführen möchte.

Ich habe versucht, die Dir.foreach und ich konnte es nicht zum Laufen bringen.

265
Andrew

Wie andere gesagt haben, Dir.foreach ist hier eine gute Option. Beachten Sie jedoch, dass Dir.entries und Dir.foreach zeigt immer . und .. (das aktuelle und das übergeordnete Verzeichnis). Sie werden im Allgemeinen nicht daran arbeiten wollen, also können Sie so etwas tun:

Dir.foreach('/path/to/dir') do |item|
  next if item == '.' or item == '..'
  # do work on real items
end

Dir.foreach und Dir.entries zeigt auch alle Einträge im Verzeichnis an - versteckt und nicht versteckt. Oft ist es das, was Sie wollen, aber wenn dies nicht der Fall ist, müssen Sie etwas tun, um die versteckten Dateien und Verzeichnisse zu überspringen.

Alternativ möchten Sie vielleicht Dir.glob was einen einfachen Wildcard-Abgleich ermöglicht:

Dir.glob('/path/to/dir/*.rb') do |rb_file|
  # do work on files ending in .rb in the desired directory
end
419
Telemachus

Dies ist meine Lieblingsmethode, um leicht zu lesen zu sein:

Dir.glob("*/*.txt") do |my_text_file|
  puts "working on: #{my_text_file}..."
end

Und Sie können dies sogar so erweitern, dass alle Dateien in Unterverzeichnissen bearbeitet werden:

Dir.glob("**/*.txt") do |my_text_file| # note one extra "*"
  puts "working on: #{my_text_file}..."
end
96
SimplGy

Dir hat auch eine kürzere Syntax, um ein Array aller Dateien aus dem Verzeichnis zu erhalten:

Dir['dir/to/files/*'].each do |fname|
    # do something with fname
end
28
wawka
Dir.foreach("/home/mydir") do |fname|
  puts fname
end
25
Fred

Die Suchbibliothek wurde speziell für diese Aufgabe entwickelt: https://Ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html

require 'find'
Find.find(path) do |file|
  # process
end

Dies ist eine Standardbibliothek Ruby, sollte also verfügbar sein

13
Faisal

Ich mag dieses, das oben nicht erwähnt wurde.

require 'pathname'

Pathname.new('/my/dir').children.each do |path|
    puts path
end

Der Vorteil ist, dass Sie ein Pathname-Objekt anstelle eines Strings erhalten, mit dem Sie nützliche Dinge tun und weiter durchlaufen können.

6
skagedal
Dir.new('/my/dir').each do |name|
  ...
end
3
Nick Moore