読み込み中...

【Ruby】初心者から上級者まで役立つdir.globの完全ガイド10選

Rubyプログラミング言語のdir.globメソッドを使ったファイル操作ガイドのイメージ Ruby
この記事は約15分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Rubyのパワフルな機能の一つに、ファイル操作があります。

その中でもdir.globメソッドは、ファイルやディレクトリの検索を行うための強力なツールとなっています。

この記事では、Rubyのdir.globメソッドを使ったファイル操作について初心者から上級者まで役立つ情報をお伝えします。

●Rubyとは

Rubyは、まつもとゆきひろ氏によって開発されたプログラミング言語で、そのコードは非常に読みやすく、書きやすいことで知られています。

この言語は、ウェブ開発からデータ解析、システムスクリプティングまで、さまざまな用途に使用されます。

●ファイル操作とは

コンピュータの基本的な操作の一つに、ファイルの作成、読み込み、更新、削除などがあります。

これらをプログラミング言語で行うことを「ファイル操作」と言います。

Rubyでも同様のファイル操作が可能で、そのための多くのメソッドが提供されています。

○Rubyでのファイル操作

Rubyでのファイル操作は、標準ライブラリの一部として提供されています。

これにより、ファイルの読み書き、削除、名前の変更、ディレクトリの作成と削除など、様々な操作が可能になります。

また、パスの操作やファイルの詳細情報の取得など、より高度な操作も可能です。

●dir.globとは

dir.globは、RubyのDirクラスのクラスメソッドで、特定のパターンにマッチするファイルやディレクトリのパスを取得することができます。

globは”global object”の略で、全体から特定のものを抽出するという意味があります。

○dir.globの基本的な使い方

基本的なdir.globの使い方は、Dir.glob(pattern)の形式で、patternには検索したいファイル名やパスのパターンを文字列で指定します。

このパターンにはワイルドカードと呼ばれる特殊文字を使うことで、より柔軟な検索が可能となります。

●dir.globの詳細な使い方

より詳細な使い方としては、パターンの他にフラグを指定できます。

たとえば、Dir.glob(pattern, flags)という形で、flagsにはFile::FNM_DOTMATCHのような定数を指定します。

この定数を指定することで、”.”で始まる隠しファイルも検索結果に含めることができます。

さて、次に実際にRubyのコードでdir.globの使い方を見てみましょう。

○サンプルコード1:特定のパターンにマッチするファイルを検索する

dir.globを用いて特定のパターンにマッチするファイルを検索するサンプルコードを紹介します。

Dir.glob('*.txt') do |file|
  puts file
end

このコードでは、”.txt”というパターンを指定して、現在のディレクトリの中から.txt拡張子を持つファイルをすべて検索します。

そして、検索した結果を一つ一つ出力しています。

この例では、ワイルドカード””を使って任意の文字列にマッチする.txtファイルを検索しています。

実行すると、現在のディレクトリ内の.txtファイルが一つずつ出力されます。

例えば、現在のディレクトリに”document.txt”や”report.txt”が存在すれば、それらのファイル名が一つずつ出力されます。

○サンプルコード2:特定のディレクトリ内の全ファイルをリストアップする

次に、特定のディレクトリ内のすべてのファイルをリストアップするためのコードを見ていきましょう。

Dir.glob('/path/to/directory/*') do |file|
  puts file
end

このコードでは、/path/to/directory/*というパターンを使って、指定したディレクトリ内のすべてのファイルとディレクトリをリストアップします。

先程と同じように、ワイルドカードを用いることで任意の名前を持つファイルを検索します。

検索結果は、引数fileとしてブロックに渡され、それぞれ出力されます。

実行結果としては、指定したディレクトリ内のすべてのファイルとディレクトリのパスが一つずつ出力されます。

例えば、/path/to/directory/内にfile1.txt, file2.txt, subdirがあった場合、それぞれのパスが出力されます。

○サンプルコード3:再帰的にファイルを検索する

さらに、ディレクトリの階層を再帰的に探索することも可能です。以下はその例を示したコードです。

Dir.glob('/path/to/directory/**/*') do |file|
  puts file
end

このコードでは、/path/to/directory/**/*というパターンを用いています。

ここで**は、任意の深さのディレクトリを表します。

つまり、このパターンは、指定したディレクトリおよびそのすべてのサブディレクトリ内の全てのファイルとディレクトリを検索します。

実行すると、指定したディレクトリとその全てのサブディレクトリ内の全てのファイルとディレクトリのパスが一つずつ出力されます。

たとえば、/path/to/directory/内にfile1.txt, subdir/file2.txtが存在した場合、それらのパスが出力されます。

●dir.globの応用例

Rubyのdir.globメソッドは、これらの基本的な使い方だけでなく、さまざまな応用が可能です。

具体的なコードを通じて、いくつかの応用例をご紹介します。

○サンプルコード4:ファイルの更新日をチェックする

次に、ファイルの更新日をチェックする方法について見ていきましょう。

Dir.glob('/path/to/directory/*') do |file|
  puts "#{file}: #{File.mtime(file)}"
end

このコードでは、File.mtime(file)メソッドを使用して、指定されたファイルの最終更新日時を取得しています。

mtimeメソッドは、引数で指定したファイルの最終更新日時をTimeオブジェクトとして返します。

このコードを実行すると、指定したディレクトリ内のすべてのファイルとディレクトリのパスとその最終更新日時が一つずつ出力されます。

たとえば、/path/to/directory/内にfile1.txt, file2.txt, subdirがあった場合、それぞれのパスとその最終更新日時が出力されます。

○サンプルコード5:ファイルのサイズを取得する

さらに、ファイルのサイズを取得する方法もdir.globメソッドを用いて実現可能です。

Dir.glob('/path/to/directory/*') do |file|
  puts "#{file}: #{File.size(file)} bytes"
end

このコードでは、File.size(file)メソッドを使用して、指定されたファイルのサイズをバイト単位で取得しています。

sizeメソッドは、引数で指定したファイルのサイズを整数として返します。

このコードを実行すると、指定したディレクトリ内のすべてのファイルとディレクトリのパスとそのサイズが一つずつ出力されます。

たとえば、/path/to/directory/内にfile1.txt(5 bytes), file2.txt(10 bytes), subdirがあった場合、それぞれのパスとそのサイズが出力されます。

○サンプルコード6:特定の文字列を含むファイルを検索する

また、特定の文字列を含むファイルを検索する場合も、dir.globメソッドを活用することができます。

Dir.glob('/path/to/directory/*.txt') do |file|
  if File.read(file).include?('特定の文字列')
    puts file
  end
end

このコードでは、まず、*.txtというパターンを用いて、.txtで終わるすべてのファイルを指定したディレクトリから検索します。

次に、`File.read(file).include?(‘特定の文字列’)`という式で、各ファイルが特定の文字列を含むかどうかを調べています。

文字列を含むファイルだけが出力されます。

このコードを実行すると、指定したディレクトリ内の.txtファイルのうち、特定の文字列を含むファイルのパスが出力されます。

例えば、/path/to/directory/内にfile1.txt(’特定の文字列’を含む), file2.txt(’特定の文字列’を含まない)があった場合、file1.txtのパスだけが出力されます。

●注意点と対処法

dir.globメソッドを使う上での注意点とその対処法を挙げていきます。

まず一つ目は、大量のファイルが存在するディレクトリに対してdir.globを使う場合です。

dir.globは指定したパターンに一致するすべてのファイルパスをメモリに格納するため、一度に大量のファイルパスを扱うとメモリ消費が激しくなる可能性があります。

これを避けるためには、Dir.eachと組み合わせて一度に扱うファイルの数を制限する、または検索パターンをより具体的にするなどして検索範囲を狭めることが効果的です。

二つ目の注意点は、dir.globが返すパスが絶対パスではなく、引数に与えたパターンに対する相対パスであるという点です。

絶対パスが必要な場合は、File.absolute_pathメソッドなどを使用して絶対パスに変換することが可能です。

また、dir.globは指定したパターンに一致するファイルが存在しない場合、空の配列を返します。

この挙動を前提としたコードを書く場合は、存在しないパスを指定してもエラーが発生しないことを確認する必要があります。

●dir.globのカスタマイズ方法

Rubyのdir.globメソッドは非常に便利である一方で、その機能を最大限に活用するためにはカスタマイズすることが重要です。

その方法について説明します。

dir.globには、任意のパターンを指定することで、特定の種類のファイルだけを取得するなど、柔軟な検索が可能です。

例えば、’.txt’というパターンを指定すれば、’.txt’で終わるすべてのファイルを取得することができます。

さらに、’*’を使用すれば、サブディレクトリまで検索範囲を広げることができます。

また、dir.globメソッドは引数としてハッシュを受け取ることもできます。

このハッシュには、ファイル検索の動作を調整するためのオプションを指定することができます。

たとえば、:baseオプションを指定すれば、パスのベース部分を省略することができます。

これは、特定のディレクトリ内のファイルだけを取り扱いたい場合などに有用です。

さらに、FNM_CASEFOLDオプションを使用すれば、大文字と小文字を区別せずにマッチングを行うことができます。

これは、ファイル名の大文字と小文字が混在する環境で検索を行う場合に便利です。

これらのカスタマイズ方法を駆使することで、dir.globメソッドはRubyにおけるファイル操作の強力なツールとなるでしょう。

○サンプルコード7:特定のパターンに一致するファイルを検索し、結果を配列に格納する

ここでは、dir.globメソッドを使って特定のパターンに一致するファイルを検索し、その結果を配列に格納する方法を学びます。

# 「.txt」で終わるファイル名を検索し、その結果を配列に格納
txt_files = Dir.glob('*.txt')

このコードでは、まずdir.globメソッドを呼び出し、その引数には検索したいパターンを文字列として渡しています。

この例では「*.txt」というパターンを指定しています。

これは「.txtで終わるすべてのファイル」を意味します。

そして、dir.globメソッドの戻り値(検索結果)は配列となります。

この配列を変数txt_filesに代入しています。そのため、txt_filesには「.txt」で終わるすべてのファイル名が格納されます。

このコードを実行すると、「.txt」で終わるファイルの一覧が得られます。

これにより、特定の種類のファイルを一覧化し、それらをさらに処理するための基礎が築かれます。

さらに進んで、これらのファイル名を順番に表示するためのコードを追加しましょう。

txt_files.each do |file|
  puts file
end

ここでは、eachメソッドを用いて配列txt_filesの各要素(ファイル名)に対して処理を行っています。

ブロック変数fileには、配列の各要素が順番に格納されます。

そして、putsメソッドを使って、これらのファイル名を表示しています。

○サンプルコード8:dir.globを使ってファイル管理システムを作る

次に、dir.globメソッドを使用して、より大規模なファイル管理システムを作る例を見ていきましょう。

ここでは、特定のディレクトリ内の全ファイルを一覧化し、それぞれのファイルサイズを取得するコードを作成します。

# ディレクトリ内の全ファイルを一覧化し、ファイルサイズを取得する
Dir.glob('*') do |file|
  size = File.size(file)
  puts "#{file}: #{size} bytes"
end

このコードでは、最初にdir.globメソッドを呼び出し、その引数には「*」というパターンを指定しています。

これは「すべてのファイル」を意味します。

そして、このメソッドにブロックを渡しています。ブロックの中で、File.sizeメソッドを使って各ファイルのサイズを取得し、その結果を出力しています。

このコードを実行すると、ディレクトリ内の全ファイルとそのサイズが表示されます。

このように、dir.globメソッドを使うと、ファイル管理システムを手軽に作成することができます。

さらに、これらの情報をハッシュに格納することで、ファイル名とそのサイズの関係を一目で把握することができます。

# ファイル名とファイルサイズの関係をハッシュに格納する
file_sizes = {}
Dir.glob('*') do |file|
  size = File.size(file)
  file_sizes[file] = size
end
p file_sizes

このコードでは、空のハッシュfile_sizesを作成した後、同様にdir.globメソッドを使用してディレクトリ内の全ファイルを取得します。

そして、各ファイルのサイズを取得し、その結果をハッシュfile_sizesに格納しています。

このコードを実行すると、ハッシュfile_sizesの内容が表示されます。

キーがファイル名、値がそのファイルのサイズとなるハッシュを作成することで、ファイル名とそのサイズの関係を一覧できます。

この方法を活用すれば、より大規模なファイル管理システムを構築する際の一助となります。

○サンプルコード9:特定のディレクトリ内の特定のファイルだけを選択的に操作する

次に、特定のディレクトリ内の特定のファイルだけを選択的に操作するという具体的なシーンを想定して、その対応策を示します。

ここでは、特定のディレクトリ内の特定の拡張子を持つファイルだけを対象に操作を行う例を挙げます。

# 特定のディレクトリ内の特定の拡張子を持つファイルだけを一覧化する
Dir.glob('*.txt') do |file|
  puts file
end

このコードでは、dir.globメソッドの引数に’*.txt’というパターンを指定しています。

このパターンは、「.txtという拡張子を持つすべてのファイル」を意味します。

そして、該当するファイルの名前を順に出力します。

このコードを実行すると、ディレクトリ内の.txtという拡張子を持つ全ファイル名が出力されます。

もし.txtファイルだけを操作したい場合、このコードはその一助となります。

さらに、特定の拡張子を持つファイルだけを操作する場合、その拡張子の種類を複数設定することも可能です。

# 特定のディレクトリ内の特定の拡張子を持つファイルだけを一覧化する
Dir.glob('*.{txt,ruby}') do |file|
  puts file
end

このコードでは、dir.globメソッドの引数に’*.{txt,ruby}’というパターンを指定しています。

このパターンは、「.txtまたは.rubyという拡張子を持つすべてのファイル」を意味します。

そして、該当するファイルの名前を順に出力します。

このコードを実行すると、ディレクトリ内の.txtまたは.rubyという拡張子を持つ全ファイル名が出力されます。

このような方法を活用すれば、複数の種類のファイルを同時に操作する際の一助となります。

○サンプルコード10:ファイルパスのパターンを活用した高度なファイル検索

Rubyでファイル操作を学ぶ上で、dir.globメソッドのもう一つの重要な特性について触れておきましょう。

それが、ファイルパスのパターンを活用した高度なファイル検索です。

この機能は、大量のファイルの中から特定の規則に従った名前のファイルを素早く見つけ出すために非常に有用です。

次のコードを見てみましょう。

# ファイルパスのパターンを活用した高度なファイル検索
Dir.glob('**/*.txt') do |file|
  puts file
end

このコードでは、引数に’/.txt’というパターンを指定しています。

ここで”は任意のディレクトリを、’.txt’は.txtという拡張子を持つファイルをそれぞれ表しています。

つまり、このパターンは、「任意のディレクトリ内の.txtという拡張子を持つすべてのファイル」を意味します。

このコードを実行すると、指定したディレクトリ下のすべてのサブディレクトリ内に存在する.txtファイルを一覧化します。

これにより、ディレクトリの階層構造を問わずに.txtファイルを探すことが可能になります。

このように、ファイルパスのパターンを活用した高度なファイル検索を行うことで、大量のファイルや複雑なディレクトリ構造の中からでも必要なファイルを効率よく見つけ出すことができます。

この機能は、大規模なプロジェクトや複数人でのチーム開発など、さまざまなシーンで役立つことでしょう。

Rubyのdir.globメソッドを用いたファイル操作について、初心者から上級者までが理解を深められるように、基本的な使用方法から応用テクニックまで詳しく解説してきました。

これらの知識を身につけることで、Rubyでのファイル操作を極め、さまざまなプログラミングタスクに対応することができるでしょう。

まとめ

これらの知識を活用すれば、プログラミングの学習や実務の中で必要となる様々なファイル操作に対応することができます。

Rubyのdir.globメソッドは、一見すると難しそうなファイル操作を、簡単で直感的なコードで実現することが可能です。

本記事のサンプルコードを参考に、ぜひ実際のコードの中で活用してみてください。