Ruby

【初学者向け】猫でもわかる!すぐに使える!Ruby Dirクラス講座

mizo

Ruby3.4リファレンスマニュアルDirクラスのページ冒頭には、Dirクラスについて

要約 ディレクトリの操作を行うためのクラスです。

と書かれています。

でもそれってどういうこと…?

と、いまいちピンとこなかったので、今回はDirクラスのおおまかな働きや使い方などをRuby初心者向けにまとめていこうと思います。

RubyのDirクラスメソッドとは?

Dir は ディレクトリ(フォルダ)を調べるためのクラスメソッド です。

たとえば

  • ディレクトリ(フォルダ)の中にあるファイルの一覧を取り出す
  • 新しいディレクトリ(フォルダ)を作る
  • ディレクトリ(フォルダ)の場所を移動する

といった、主にディレクトリに関する操作ができます。

そもそも「ディレクトリの操作」ってどういう意味?

たとえばディレクトリ(フォルダ)の中身を見たり、新しいディレクトリを作ったり、ディレクトリ間を移動したり、ディレクトリを削除したり・・・といったこと全般の操作 を「ディレクトリの操作」と呼んでいます。

なお、ここでいう「ディレクトリ」と、一般的に浸透しているであろうPC用語の「フォルダ」は基本的に同じ意味で、ファイルを整理するための入れ物のことを指しています。
OSの種類によってその入れ物についての呼び方が異なり、WindowsやmacOSでは「フォルダ」、LinuxやUnix系のOSでは「ディレクトリ」と呼んでいます。

つまりDirクラスは

  • 中を見たい!」 → entries, glob
  • フォルダを作りたい!」→ mkdir
  • 移動したい!」→ chdir
  • 今どこにいるか知りたい!」→ Dir.pwd

といった、「ディレクトリ(フォルダ)に関すること」を扱う専門のクラスといえます。

よく使うメソッドのご紹介

ここで、Dirクラスのなかでもとりわけよく使われる2つのメソッドをご紹介します。

Dir.entries(でぃる・えんとりーず)メソッド

Ruby3.4リファレンスマニュアルには、Dir.entriesメソッドについて

entries(path) -> [String]
ディレクトリ path に含まれるファイルエントリ名の配列を返します。

との説明があります。

たった二文ではありますが、それぞれ説明している内容が異なるため、それぞれの項目を分解して読み解いていきましょう。

entries(path) -> [String]とは?

まず以下の部分です。

entries(path) -> [String]

これはRubyリファレンス特有の書き方 で、Dirクラスのentries メソッドがどういう「形」で使えるのかを示したものです。シグネチャと呼ばれます。

部分意味
entries(path)必須引数でディレクトリのパスのこと
-> [String]戻り値は文字列の配列(ファイル名一覧)

-> [String]-> 以降は戻り値を示していて、それが [String] の形、つまり「文字列の配列で返りますよ」と示しています。

ディレクトリ path に含まれるファイルエントリ名の配列を返します」とは?

続いて以下の部分です。

「ディレクトリ path に含まれるファイルエントリ名の配列を返します」

これはentries メソッドの機能についての説明です。

つまり、「指定したディレクトリ(=path)の中に入っているファイルやフォルダの名前を、文字列の一覧(配列)として返す」メソッドであるということです。

もう少し噛み砕いて説明すると、

指定したディレクトリの中に何があるかをすべて調べ、その名前をまとめて配列として返してくれるメソッド

といえます。

Dir.entries メソッドの使い方

使い方は以下のとおりです。

Dir.entries(".")

入力したものを分解して説明すると・・・

部品意味
DirRubyに最初から用意されている「フォルダを扱うための道具(クラス)
entries中身の一覧を取り出す」ための命令(=メソッド)
"."今いる場所(カレントディレクトリ)」を指す記号

つまり、「今いる場所のディレクトリの中身を出力して」という指示を出したことになるわけです。

実際の出力結果を見てみよう!

たとえば、以下のようなファイルが今いるディレクトリにあるとします。

main.rb
notes.txt

このときにいる場所でDir.entries(".")と今入力をすると、次のような結果が返ってくるはずです。

[".", "..", "main.rb", "notes.txt"]

これはつまり、

要素意味
"."今のディレクトリ(フォルダ)自身のこと
".."1つ上の階層にあるディレクトリ(フォルダ)のこと
"main.rb""main.rb"というファイルの名前
"notes.txt""notes.txt"というファイルの名前

今いるディレクトリには、上記のようなものが含まれていますよ、と文字列の配列として一覧表示してくれているわけです(なお、隠しファイルがあればそれももれなく出力されます)。

Dir.glob(でぃる・ぐろぶ)メソッド

Ruby3.4リファレンスマニュアルには、Dir.globメソッドについて

glob(pattern, flags = 0, base: nil, sort: true) -> [String]
ワイルドカードの展開を行い、パターンにマッチするファイル名を文字列の配列として返します。パターンにマッチするファイルがない場合は空の配列を返します。
ブロックが与えられたときはワイルドカードにマッチしたファイルを引数にそのブロックを 1 つずつ評価して nil を返します。

との説明があります。

こちらは先ほどのDir.entriesメソッドよりもやや長めの解説になっているので、こちらもまたそれぞれの項目を分解して読み解いていきましょう。

Dir.glob(pattern, flags = 0, base: nil, sort: true) -> [String] とは?

まずは以下の部分から。

Dir.glob(pattern, flags = 0, base: nil, sort: true) -> [String]

これは Dir クラスの glob メソッドがどういう形で使えるのか を表したものです。

以下ではそれぞれの引数の意味を分解して説明しています。
(引数とはDir.globに続くカッコ内の部分のことです)

引数意味
pattern(必須)探したいファイル名のパターンのこと(例:"*.rb""lib/**/*.rb"など)
flags(省略可)検索時の細かいオプションを数値で指定します。通常は 0(=指定なし)でOKです。
base(省略可)検索の基準とするディレクトリを文字列で指定できます。通常は現在のディレクトリ ( "." )となっています。
sort(省略可)true とした場合は結果をソート(並び替え)して返します。なおデフォルトは trueです。

基本的な使用例のご紹介

文字だけの説明では使用するイメージが掴みにくいと思いますので、よく使う基本パターンをご紹介していきます。

一番よく使うパターン(基本形)
Dir.glob("*.rb")

今いるフォルダの中にある .rb ファイルだけを配列で返します

サブディレクトリも含めて再帰的に探すパターン(応用編その1)
Dir.glob("lib/**/*.rb")
lib ディレクトリ以下すべての .rb ファイルを再帰的に探します

なお「再帰的に探す」とは、あるディレクトリ(フォルダ)の中だけでなく、その中にあるサブディレクトリ(またはさらにその中のサブディレクトリも…)をどんどんたどって深く深く調べていくことを意味しています。

つまり **/*.rb は「下の階層も全部含めて .rb ファイルを探してくれ」という命令になっています。

並び順をソートせずにそのまま返す(応用編その2)
Dir.glob("*.rb", sort: false)

.rb ファイルを探しますが、sort: falseになっていますので、順番は並び替えせず、見つけたまま返します

検索の基準ディレクトリを変更て探します(応用編その3)
Dir.glob("*.md", base: "docs")

docs フォルダの中で、.md ファイルを探します

応用編含めて使用例を確認したことで、使い方のイメージが掴みやすくなったのではないかと思います。

おわりに

Dir.entriesメソッドとDir.globメソッドは、Rubyでファイル操作をするうえでとてもに便利なメソッドです。

Ruby初心者でも扱いやすいメソッドなので、ぜひ実際に手を動かして活用してみてください!

ABOUT ME
mizo
mizo
「(株)現場サポート」という会社で働きながら、オンラインスクール「フィヨルドブートキャンプ」でプログラミングを学習しています。
記事URLをコピーしました