ディレクトリを再帰的に走査するDir.globとFind.find
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
以前に、ディレクトリをオープンしてファイル名を読むで、ディレクトリを再帰的に走査するために、再帰関数を作ってみた。
しかし、再帰関数を書くよりも、Dir.globやFind.findを使ったほうが簡単です。
以下のような構造のディレクトリを走査してみます。
スポンサーリンク
C:\ROOT_DIR │ bar.rb │ baz.rb │ foo.rb │ └─sub_dir │ sub_bar.rb │ sub_baz.rb │ sub_foo.rb │ └─sub_sub_dir sub_sub_bar.rb sub_sub_baz.rb sub_sub_foo.rb
Dir.globとFind.findを使ったディレクトリ走査コード
# ディレクトリを再帰的に抽出する require 'find' require 'pp' root = "C:/root_dir" # Dir.globの場合、エントリの配列が返る puts "--- Dir.glob ---" dir_entries = Dir.glob(root + "/" + "**/*") pp dir_entries # Find.findは、走査を行う。findをrequireして使う。 puts "--- Find.find ---" find_entries = Array.new Find.find(root) do |path| find_entries.push(path) end pp find_entries
実行結果
--- Dir.glob --- ["C:/root_dir/bar.rb", "C:/root_dir/baz.rb", "C:/root_dir/foo.rb", "C:/root_dir/sub_dir", "C:/root_dir/sub_dir/sub_bar.rb", "C:/root_dir/sub_dir/sub_baz.rb", "C:/root_dir/sub_dir/sub_foo.rb", "C:/root_dir/sub_dir/sub_sub_dir", "C:/root_dir/sub_dir/sub_sub_dir/sub_sub_bar.rb", "C:/root_dir/sub_dir/sub_sub_dir/sub_sub_baz.rb", "C:/root_dir/sub_dir/sub_sub_dir/sub_sub_foo.rb"] --- Find.find --- ["C:/root_dir", "C:/root_dir/sub_dir", "C:/root_dir/sub_dir/sub_sub_dir", "C:/root_dir/sub_dir/sub_sub_dir/sub_sub_foo.rb", "C:/root_dir/sub_dir/sub_sub_dir/sub_sub_baz.rb", "C:/root_dir/sub_dir/sub_sub_dir/sub_sub_bar.rb", "C:/root_dir/sub_dir/sub_foo.rb", "C:/root_dir/sub_dir/sub_baz.rb", "C:/root_dir/sub_dir/sub_bar.rb", "C:/root_dir/foo.rb", "C:/root_dir/baz.rb", "C:/root_dir/bar.rb"]
Find.find を使った場合、基点にしたパス(C:/root_dir)も含まれるようです。
Dir.globで使っている「**/*」は、ディレクトリを再帰的にたどってマッチを行うための指定。
**/ ワイルドカード */ の0回以上の繰り返しを意味し、 ディレクトリを再帰的にたどってマッチを行います。 例えば, foo/**/bar は foo/bar, foo/*/bar, foo/*/*/bar … (以下無限に続く)に対してそれぞれ マッチ判定を行います。
スポンサーリンク
>> 次の記事 : DATAと__END__でファイルオブジェクトを扱う
<< 前の記事 : ファイル名の取り出し・変更・操作
- - 関連記事 -
- Ruby1.7.3のソースコード行数を調べる
- DATAと__END__でファイルオブジェクトを扱う
- ファイル名の取り出し・変更・操作
- FileTestモジュールでファイルを検査する
- File::statの時刻を変更する
- ファイル・ディレクトリの属性取得
- グロブ・Dir.globを使ってディレクトリ検索
- ディレクトリをオープンしてファイル名を読む
- ファイル名の変更・ファイルのコピー・移動・削除
スポンサーリンク