各ファイルでコードのブロックを実行できるように、Rubyでループを作成するにはどうすればよいですか?
私はRubyを初めて使用しますが、これを行う方法はdo eachループであると結論付けました。
Rubyファイルは、ループしたいディレクトリとは異なるディレクトリから実行されます。
Dir.foreach
を試しましたが、動作させることができませんでした。
他の人が言ったように、 Dir.foreach
はここで良いオプションです。ただし、 Dir.entries
およびDir.foreach
は常に.
および..
(現在および親ディレクトリ)を表示することに注意してください。通常、それらの作業はしたくないので、次のようなことができます。
Dir.foreach('/path/to/dir') do |item|
next if item == '.' or item == '..'
# do work on real items
end
Dir.foreach
とDir.entries
は、ディレクトリ内のすべてのアイテムも表示します-非表示でも非表示でも同様です。多くの場合、これはあなたが望むものですが、そうでない場合は、隠しファイルとディレクトリをスキップするために何かをする必要があります。
または、単純なワイルドカードマッチングを提供する Dir.glob
を調べることもできます。
Dir.glob('/path/to/dir/*.rb') do |rb_file|
# do work on files ending in .rb in the desired directory
end
これは読みやすい私のお気に入りの方法です。
Dir.glob("*/*.txt") do |my_text_file|
puts "working on: #{my_text_file}..."
end
さらに、これをサブディレクトリ内のすべてのファイルで動作するように拡張することもできます。
Dir.glob("**/*.txt") do |my_text_file| # note one extra "*"
puts "working on: #{my_text_file}..."
end
Dirには、ディレクトリからすべてのファイルの配列を取得するための短い構文もあります。
Dir['dir/to/files/*'].each do |fname|
# do something with fname
end
Dir.foreach("/home/mydir") do |fname|
puts fname
end
検索ライブラリは、このタスク専用に設計されています: https://Ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
require 'find'
Find.find(path) do |file|
# process
end
これは標準のRubyライブラリなので、利用できるはずです
私はこれが好きです、それは上で言及されていません。
require 'pathname'
Pathname.new('/my/dir').children.each do |path|
puts path
end
利点は、文字列ではなくPathnameオブジェクトを取得できることです。これにより、有用な処理を実行したり、さらにトラバースしたりできます。
Dir.new('/my/dir').each do |name|
...
end