Rubyでファイルやディレクトリを操作する際、標準の File クラスや Dir クラスだけでは、「ディレクトリごとコピーしたい」「深い階層のディレクトリを一気に作りたい」といった処理が少し面倒になることがあります。
そんな時に活躍するのが、Ruby標準ライブラリの FileUtils モジュールです。
FileUtils モジュールを使えば、UNIXシェルコマンド(cp, mv, rm など)と同じような感覚で、簡潔かつ強力にファイル操作を行うことができます。この記事では、FileUtils の基本的な使い方から、実務で頻出する再帰的なコピーや強制削除、そして万が一の事故を防ぐためのデバッグオプションまで、サンプルコード付きで徹底解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
FileUtilsとは?Fileクラスとの違い
FileUtils は、Rubyに標準で組み込まれているライブラリ(モジュール)です。
File クラスがファイルの読み書きや属性取得といった「点」の操作を得意とするのに対し、FileUtils はファイルのコピー、移動、削除、ディレクトリ作成といった「ファイルシステム全体」に関わる操作を得意としています。
利用するための準備
標準ライブラリですが、組み込みではないため、使用するには require が必要です。
require 'fileutils'
# これで FileUtils.メソッド名 の形式で使えるようになります
UNIXコマンド(LinuxやMacのターミナルで使うコマンド)とほぼ同じメソッド名が用意されているため、コマンドライン操作に慣れている人にとっては学習コストが非常に低いのが特徴です。
ディレクトリを作成する mkdir / mkdir_p
ディレクトリ(フォルダ)を作成するには mkdir を使いますが、実務では mkdir_p の方を圧倒的に多く使います。
親ディレクトリも同時に作る mkdir_p
通常の mkdir は、親ディレクトリが存在しないとエラーになりますが、mkdir_p は必要に応じて親ディレクトリも自動で作成してくれます(UNIXコマンドの mkdir -p に相当)。
require 'fileutils'
# 通常の作成('data'ディレクトリがないとエラーになる)
# FileUtils.mkdir('data/2024/01')
# 再帰的な作成(途中のディレクトリも全部作ってくれる)
FileUtils.mkdir_p('data/2024/01/log')
# 配列で渡せば複数作成も可能
FileUtils.mkdir_p(['images/icon', 'images/bg'])
mkdir_p を使うことで、data ディレクトリが存在しなくても、data → 2024 → 01 → log と一気に階層構造を作成できます。
既にディレクトリが存在していてもエラーにならず無視してくれるため、スクリプトの初期化処理などで非常に重宝します。
ファイルをコピーする cp / cp_r
ファイルの複製には cp(copy)を使います。
ディレクトリごとコピーしたい場合は cp_r(copy recursive)を使います。
単一ファイルのコピー
require 'fileutils'
# 'source.txt' を 'backup.txt' にコピー
FileUtils.cp('source.txt', 'backup.txt')
# 別のディレクトリにコピー
FileUtils.cp('source.txt', 'backup_dir/')
ディレクトリごとの再帰的コピー
ディレクトリの中身を含めて丸ごとコピーしたい場合は、cp_r を使用します。
require 'fileutils'
# 'src_dir' の中身をすべて 'dist_dir' にコピー
FileUtils.cp_r('src_dir', 'dist_dir')
# 複数のファイル・ディレクトリをまとめてコピー
FileUtils.cp_r(['file1.txt', 'dir1'], 'backup_dir')
cp_r は、UNIXコマンドの cp -r に相当します。
画像フォルダのバックアップや、デプロイ時の資材コピーなどで頻繁に使用されます。
コピー先に同名のディレクトリがある場合の挙動(中に入るか、統合されるか)はOSのコマンド挙動に準拠するため、パスの末尾にスラッシュをつけるかどうか意識すると良いでしょう。
ファイルを移動・リネームする mv
ファイルの場所を移したり、ファイル名を変更したりするには mv(move)を使います。
Rubyには File.rename もありますが、FileUtils.mv はディレクトリの移動や、異なるファイルシステム間での移動もサポートしているため強力です。
移動とリネームの基本
require 'fileutils'
# ファイルの移動(docsフォルダへ)
FileUtils.mv('readme.txt', 'docs/')
# ファイルのリネーム(old.txt を new.txt へ)
FileUtils.mv('old.txt', 'new.txt')
# 配列で渡して一括移動
FileUtils.mv(['file1.txt', 'file2.txt'], 'archive_dir/')
第2引数が既存のディレクトリであれば「移動」、そうでなければ「リネーム(移動して名前変更)」として振る舞います。
オプションとして force: true を指定すると、移動先に同名ファイルがあっても警告なしで上書きします。
ファイルを削除する rm / rm_rf
ファイルの削除には rm(remove)を使いますが、ディレクトリを中身ごと消去する rm_rf が最もよく使われます。
強制的に削除する rm_rf
require 'fileutils'
# 単一ファイルの削除
FileUtils.rm('temp.txt')
# ディレクトリごと強制削除(中身があっても消す)
FileUtils.rm_rf('cache_dir')
# 複数の対象を削除
FileUtils.rm_rf(['temp', 'logs'])
rm_rf は UNIXコマンドの rm -rf に相当する強力なメソッドです。
「対象がディレクトリでも」「中身が入っていても」「存在しなくても(エラーを出さずに)」削除します。
非常に便利ですが、誤って重要なディレクトリ(プロジェクトルートなど)を指定すると復元できないため、使用する際はパスの指定に細心の注意を払ってください。
実務で役立つ!デバッグに便利なオプション
ファイル操作を行うスクリプトは、一歩間違えると大切なデータを消してしまうリスクがあります。
FileUtils の各メソッドには、安全に実行するための便利なオプションが用意されています。
実行内容を表示する verbose: true
何が行われているかをコンソールに出力します。
FileUtils.cp('a.txt', 'b.txt', verbose: true)
実行結果
cp a.txt b.txt
実際には実行しない noop: true
“No Operation” の略で、実際にはファイル操作を行わず、何をするかだけをシミュレートします。
verbose: true と組み合わせることで、「実行されるはずのコマンド」を確認するドライラン(予行演習)が可能になります。
# 実際には削除せず、削除する予定のファイルを表示する
FileUtils.rm_rf('/important/data', verbose: true, noop: true)
実行結果
rm -rf /important/data
このコードは実際にはファイルを削除しません。
コンソールに「このコマンドを実行しますよ」と表示するだけです。
バッチ処理やデプロイスクリプトを作成する際は、まずこの noop: true をつけて動作確認を行うことを強くおすすめします。
Rubyのスキルを活かして年収を上げる方法
以上、RubyのFileUtilsモジュールの使い方について解説してきました。
Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



