web-dev-qa-db-ja.com

1つのディレクトリ内のすべてのファイルを反復処理する

各ファイルでコードのブロックを実行できるように、Rubyでループを作成するにはどうすればよいですか?

私はRubyを初めて使用しますが、これを行う方法はdo eachループであると結論付けました。
Rubyファイルは、ループしたいディレクトリとは異なるディレクトリから実行されます。

Dir.foreachを試しましたが、動作させることができませんでした。

261
Andrew

他の人が言ったように、 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.foreachDir.entriesは、ディレクトリ内のすべてのアイテムも表示します-非表示でも非表示でも同様です。多くの場合、これはあなたが望むものですが、そうでない場合は、隠しファイルとディレクトリをスキップするために何かをする必要があります。

または、単純なワイルドカードマッチングを提供する Dir.glob を調べることもできます。

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

これは読みやすい私のお気に入りの方法です。

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
95
SimplGy

Dirには、ディレクトリからすべてのファイルの配列を取得するための短い構文もあります。

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

検索ライブラリは、このタスク専用に設計されています: https://Ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html

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

これは標準のRubyライブラリなので、利用できるはずです

12
Faisal

私はこれが好きです、それは上で言及されていません。

require 'pathname'

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

利点は、文字列ではなくPathnameオブジェクトを取得できることです。これにより、有用な処理を実行したり、さらにトラバースしたりできます。

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