RubyではFileUtilsモジュールを利用することで、ファイル操作(コピー・移動・削除など)を簡単に行えるようになります。
本記事では、Rubyでのファイル操作方法を知りたい開発者向けに、FileUtilsの使い方についてサンプルコードを掲載しながら紹介していきます。
目次
RubyのFileUtilsとは
FileUtilsは、Rubyのデフォルト機能として提供されている基本的なファイル操作を集めたモジュールです。
組み込みモジュール
FileUtilsを利用したい場合、Rubyの「require ‘fileutils’」でライブラリを読み込む必要があります。
FileUtilsはモジュールとして提供されていることから、インスタンス化することなく利用することが出来ます。
FileUtilsで頻繁に利用されるメソッド
FileUtilsには数多くのメソッドが用意されていますが、なかでも「コピー」「移動」「削除」処理は必ず把握しておきたい頻出処理です。
- コピー: cp
- 移動: mv
- 削除: rm
cpメソッドでファイルをコピーする
cpメソッドを利用すると、既存ファイルを指定したパスにコピーすることが可能です。
指定した「ファイル」をコピーする「cp」メソッドと、指定したフォルダをコピーする「cp_r」メソッドが利用出来ます。
基本構文
「cp」メソッドと「cp_r」メソッドは下記のように記述します。
cp(src, dist[, options]) cp_r(src, dist[, options])
srcに指定したファイルをdistに指定したパスにコピーします。
srcには配列で複数ファイルを指定することも可能です。
1つのファイルをコピーする
srcに存在する1つのファイルを指定して、distに指定したパスにコピーしてみましょう。
「tree」コマンドで現在のフォルダ配下を表示
$tree . ├── files └── sample.rb
treeコマンドはMacの標準機能では利用出来ないため、Homebrewなどでインストールする必要があります。
下記の記述で「sample.rb」を「files」配下にコピーします。
require 'fileutils' FileUtils.cp('sample.rb', 'files')
実行結果
$tree . ├── files │ └── sample.rb └── sample.rb
指定したフォルダにファイルがコピーされています。
コピー元に指定したファイルが存在しない場合エラーが出力されます。
複数ファイルをコピーする
srcに複数ファイルを指定する場合、配列で指定する必要があります。
まずはtreeコマンドで現在のフォルダ配下を確認します。
$tree . ├── files ├── sample.rb ├── sample2.rb └── sample3.rb
配列に指定したファイルを全て「files」フォルダにコピーします。
require 'fileutils' FileUtils.cp(['sample.rb', 'sample2.rb', 'sample3.rb'], 'files')
実行結果
$tree . ├── files │ ├── sample.rb │ ├── sample2.rb │ └── sample3.rb ├── sample.rb ├── sample2.rb └── sample3.rb
指定したフォルダを全てコピーする
「cp_r」メソッドでは、srcに指定したフォルダ(配下フォルダ・ファイル含む)をdistに指定したパスにコピーします。
treeコマンドでフォルダ配下を確認しておきます。
$tree . ├── files ├── origin │ ├── sub │ │ └── test3.rb │ ├── test1.rb │ └── text2.rb └── sample.rb
「cp_r」メソッドで「origin」フォルダの内容を「files」配下にコピーします。
require 'fileutils' FileUtils.cp_r('origin', 'files')
実行結果
$tree . ├── files │ └── origin │ ├── sub │ │ └── test3.rb │ ├── test1.rb │ └── text2.rb ├── origin │ ├── sub │ │ └── test3.rb │ ├── test1.rb │ └── text2.rb └── sample.rb
mvメソッドでファイルを移動する
mvメソッドでは、srcに指定したファイルをdistに移動させることが出来ます。
基本構文
基本的な記述方法はcpメソッドと同じです。
mv(src, dist[, options])
srcに移動させたいファイルを指定し、distで指定したフォルダに移動させます。
1つのファイルを移動させる
まずはいつも通りtreeコマンドを実行しておきます。
$tree . ├── files └── sample.rb
「sample.rb」ファイルを「files」フォルダに移動させます。
require 'fileutils' FileUtils.mv('sample.rb', 'files')
実行結果
$tree . └── files └── sample.rb
複数ファイルを移動
複数ファイルを指定する場合、cpメソッド同様配列で指定します。
treeコマンドでフォルダを確認
$tree . ├── files ├── sample.rb ├── sample2.rb └── sample3.rb
配列で指定した複数のファイルを「files」フォルダに移動させる
require 'fileutils' FileUtils.mv(['sample.rb', 'sample2.rb', 'sample3.rb'], 'files')
実行結果
$tree . └── files ├── sample.rb ├── sample2.rb └── sample3.rb
ファイル名を変更する
mvメソッドでファイル名を変更するというような利用方法も可能です。
treeコマンドでフォルダを確認
$tree . ├── files └── sample.rb
「sample.rb」を「test.rb」に変更してみましょう。
require 'fileutils' FileUtils.mv('sample.rb', 'test.rb')
実行結果
$tree . ├── files └── test.rb
rmメソッドでファイルを削除する
rmメソッドでは引数に指定したファイルを削除することが可能です。
「rm_r」メソッドを利用することで、指定したフォルダを再帰的に削除することも出来ます。
基本構文
ファイル削除関連の各種メソッドでは、引数に削除対象を指定して実行します。
FileUtils.rm(list) FileUtils.rm_r(list)
listには削除したいファイルを1つだけ指定するのはもちろん、複数ファイルを配列で指定することも可能です。
ファイルを指定して削除
まずは現在のフォルダ配下を確認します。
$ls files sample.rb test.rb
サンプルとして「test.rb」ファイルを指定して削除してみましょう。
require 'fileutils' FileUtils.rm('test.rb')
実行結果
$ruby sample.rb $ls files sample.rb
削除対象のファイルがロック(読み取り専用)状態の場合は削除出来ません。
複数ファイルを配列指定で削除
配列指定で複数ファイルの削除も確認していきます。
$ls files sample.rb test1.rb test2.rb test3.rb
「test2.rb」と「test3.rb」のファイルを指定して削除してみましょう。
require 'fileutils' FileUtils.rm(['test2.rb', 'test3.rb'])
実行結果
$ruby sample.rb $ls files sample.rb test1.rb
フォルダ指定で削除
「rm_r」メソッドを使用したフォルダ指定での削除処理も確認していきます。
$tree . ├── files │ ├── sub │ │ └── test3.txt │ ├── test1.txt │ └── test2.txt └── sample.rb
「rm_r」メソッドに「files」フォルダを指定し実行してみます。
require 'fileutils' FileUtils.rm_r('files')
実行結果
$ruby sample.rb $tree . └── sample.rb
削除対象として指定したフォルダを、格納されたファイルも含めて削除することが出来ました。
さいごに: FileUtilsモジュールを利用してRubyでのファイル操作に挑戦してみよう
本記事では、Rubyの標準モジュールとして提供されているFileUtilsの使い方について紹介してきました。
今回ご紹介した内容は、FileUtilsモジュールの中でも頻繁に利用されるコピー(cp)・移動(mv)・削除(rm)のみで、まだまだ便利なメソッドがたくさん提供されています。
公式ドキュメントに各メソッドの利用方法が解説されていますので、合わせてご参照ください。
今回は基本的な使い方をご紹介するため、第3引数のオプションについては省略させて頂きます。