Rubyでディレクトリを操作する方法!DirクラスとFileUtilsの使い方を徹底解説
実は、Rubyを使えばファイルシステム内を自由に行き来できます。その鍵となるのが、Ruby標準の「Dir」クラスです。
Dirクラスを使えば、ディレクトリ内の一覧表示はもちろん、カレントディレクトリの変更や、新しいフォルダの作成まで行えます。
まずは簡単な例から見てみましょう。
filenames = Dir.entries(".")
このentriesメソッドは、ファイル名のエントリを配列として返します。返される各要素は文字列なので、実際にファイルの中身を読みたい場合は、RubyのFileクラスと組み合わせて使う必要があります。
ちなみに、このドット(.)は現在のディレクトリ(カレントディレクトリ)を表しています。
ここで注意したいのは、カレントディレクトリとは「コードが実行されている場所」のことであり、「ターミナル上で自分がいる場所」ではないという点です。
そのため…
Dir.pwdメソッドを使って、今どのディレクトリでコードが動いているか確認しておくと便利です。
それでは、Dirクラスを使った新しいディレクトリの作成(mkdir)、名前変更(mv)、特定パターンに一致するファイル名の検索(glob)の方法を順番に見ていきましょう。
Rubyのmkdirメソッドで新しいディレクトリを作成する
Rubyで新しいフォルダを作りたいときは、Dir.mkdirメソッドを使用します。
例:
Dir.mkdir("testing")
相対パスを指定した場合、ディレクトリはカレントパス(Dir.pwd)の下に作成されます。
発生しうる主なエラーは以下の通りです。
- ディレクトリがすでに存在する場合(
Errno::EEXIST) - 権限がない場合(
Errno::EACCES) - まだ存在しない親フォルダの下にフォルダを作ろうとした場合(
Errno::ENOENT)
最後のエラーは、ネストした(入れ子になった)ディレクトリを作ろうとしたときや、存在しない絶対パスを指定したときによく発生します。
解決策は2つあります。
- 作成前に
Dir.exist?でディレクトリの存在をチェックする - より高機能なクラスを使う(次のセクションで紹介)
それでは、さらに学んでいきましょう!
FileUtilsモジュールによる高度なディレクトリ操作
もう少し強力な機能が必要なときは、標準ライブラリのFileUtilsモジュールを取り入れましょう。
FileUtilsには、ネストしたディレクトリを一括で作成できるmkdir_pのようなメソッドが含まれています。
例を見てみましょう。
require 'fileutils'
FileUtils.mkdir_p("/tmp/testing/a/b")
かなり便利ですよね。
しかもこれだけではありません。FileUtilsは、すべてのファイル操作に対してキーワード引数形式の追加オプションを提供しています。たとえば、実行されるLinuxコマンドを出力するverboseオプションや、実際にはファイルを変更しないnoopオプションなどがあります。
ぜひ試してみてください!
ディレクトリの名前を変更する方法
Rubyでは、OSのユーザーインターフェースやターミナルから行える操作を、ほぼすべて実行できます。
たとえば…
ディレクトリの名前変更は次のように行います。
FileUtils.mv("/tmp/a", "/tmp/b")
なお、mvメソッドはDirクラスには用意されていないため、こちらもFileUtilsを使う必要があります。
カレントディレクトリを変更する方法
すべてのディレクトリ操作はカレントディレクトリを基準に実行されるため、状況によってはカレントディレクトリを変更したくなることもあるでしょう。
その場合は、Dir.chdirメソッドを使います。
例:
Dir.chdir("/tmp") { Dir.entries(".") }
chdirには2つの使い方があります。
- ブロック付きの場合:ブロック内のコードを実行している間だけカレントディレクトリが変わる
- ブロックなしの場合:メソッド呼び出し以降のすべてのコードに対してカレントディレクトリが変わる
また、chdirによる変更はあくまでRubyプロセス内部だけで有効であり、「外の世界」には影響しない点にも注目してください。
つまり…
Rubyプログラムの実行が終わっても、シェルの作業ディレクトリは元のまま変わりません。
パターンマッチングでファイル&ディレクトリ一覧を取得する
フォルダ内のRubyファイルをすべて見つけたいと思いませんか? globメソッドを使えば、とても簡単です!
例:
Dir.glob("*.rb")
拡張子は「.txt」「.yml」など、好きなものを指定できます。ファイル名の一部に含まれる任意のテキストでの絞り込みも可能です。
すべてのサブフォルダ内のファイルも検索したい場合は?
はい、それも可能です。
Dir.glob("**/*.rb")
結果は、相対パスを含むすべてのファイル名の配列として返されます。取得したリストの各ファイルに対してFile.basenameメソッドを使えば、パス部分を取り除いてファイル名だけを取り出すことができます。
まとめ
今回は、DirクラスとFileUtilsを使って、Rubyでディレクトリを扱う方法を学びました。
ディレクトリの一覧取得から作成・名前変更・パターン検索まで、日常的なファイル操作はこれでバッチリです。ぜひ実際のコードで試して、理解を深めてください。
最後まで読んでいただきありがとうございました!🙂
-
Ruby 2.6のMJITとは?仕組みとパフォーマンスを徹底解説
Rubyのパフォーマンスは、バージョンが上がるごとに大きく向上してきました。そしてRuby開発チームは、さらに速いRubyを実現するために全力を尽くしています。 その取り組みのひとつが「3×3プロジェクト」です。 その目標とは? Ruby 3.0を、Ruby 2.0の3倍速くすることです。 このプロジェクトの一環として誕生したのが、新しいMJITコンパイラです。これが本記事のテーマとなります。 MJITとは何か MJITは「Method Based Just-in-Time Compiler(メソッドベースのジャストインタイムコンパイラ)」の略称です。 これは具体的にどういう意味でしょうか?
-
Rubyでパーサーを自作する方法!StringScannerを使った実装手順を徹底解説
パース(構文解析)とは、文字列の集まりから意味を読み取り、プログラムが扱える形のデータへと変換する技術です。正規表現でも文字列の解析は可能ですが、すべての場面に適しているわけではありません。 たとえば、正規表現でHTMLを解析するのはあまり良い方法ではないというのは、プログラミング界隈ではよく知られた話です。 Rubyにはnokogiriという強力なライブラリがあり、HTMLの解析はこれに任せられます。しかし、自分でパーサーを一から作ってみると、文字列処理や構文解析の仕組みについて多くのことを学べます。それでは早速始めていきましょう! Rubyでのパースの基本:StringScannerクラス