こんにちは! フリーエンジニアの長瀬です。
みなさんはFileutilsを使っていますか?
Fileutilsのライブラリーを使えばUnix/Linuxコマンドがrubyスクリプトから利用できるようになります。
使いこなせればより動的にファイルをコピーしたり、削除したりとプログラミングで自動化できる幅が広がります。
この記事では、rubyのFileutilsについて
・ Unix/Linuxコマンドとは
・ cp、cp_rとは
・ Fileutilsでcp、cp_rを実行する
・ rm、rm_r、rm_rf とは
・ Fileutilsで rm、rm_r、rm_rf を実行する
という基本的な内容から、
・ touchでファイルを更新する方法
・ cmpでファイルを比較する方法
・ exists?でファイルの存在を確認する方法
・ pwdで現在のディレクトリを確認する
・ mvでファイルを移動する
といった応用的な内容についても解説していきます。
Unix/Linuxコマンドとは
FileUtilsのライブラリはUnix/Linuxコマンドをrubyから使えるようにするために作成されています。
つまり、そもそもこのライブラリを使いこなすためには最低限Unix/Linuxコマンドの知識が必要です。
なので、Unix/Linuxコマンドど聞いてピンとこない人はまずUnix/Linuxコマンドに関する以下の記事を一読することをおすすめします。
そして、ある程度インプットが済んでからこの先を読み進めてください。
ファイルをコピーする方法(cp cp_r)
cp、cp_rとは
- cp(copy)は、ファイルをコピーします。
- cp_r(copy recursively)は、フォルダの配下のすべてのサブフォルダとファイルをコピーします。
Fileutilsでcp、cp_rを実行する
rubyのFileUtilsでファイルやフォルダをコピーするメソッドは、UNIX/Linuxのコマンドラインで使用するコマンドと全く同じです。
[FileUtilsのメソッド]
コマンド | コマンドの意味 |
---|---|
FileUtils.cp(src,dst) | srcのファイルをdstのファイルへコピーする |
FileUtils.cp_r(src, dst) | srcのフォルダをdstのフォルダへコピーする。rは再帰的(Recursive)にフォルダをたどるという意味。 |
UNIX/LinuxのコマンドラインでFileUtilsと同等のことを行うには、以下のようにコマンドを実行します。
$ # ファイルをコピーする $ cp .bashrc .bashrc_backup $ # フォルダを配下のサブフォルダやファイル丸ごとコピーする $ cp -r ./app_v1.0.2 /path/to/backup/
RubyのFileUtilsメソッドを使ってファイルやフォルダを操作する実際のコードは、以下のようになります。
FileUtilsのメソッドはすべて対応するUNIX/Linuxコマンドと同等のファイル操作を行います。
require 'Fileutils' # ファイルをコピーする FileUtils.cp(".bashrc", ".bashrc_backup") # フォルダを配下のサブフォルダやファイル丸ごとコピーする FileUtils.cp_r("./app_v1.0.2", "/path/to/backup/")
ファイルを削除する方法(rm rm_r rm_rf)
rm、rm_r、rm_rf とは
- rm(remove)は、ファイルを削除します。
- rm_f(remove force)は、ファイルを削除します。読み取り専用のファイルがあった場合でも警告せず強制的に削除します。
- rm_r(remove recursively)は、フォルダの配下のすべてのサブフォルダとファイルを削除します。ただし、読み取り専用のファイルがあった場合は削除せず警告します。
- rm_rf(remove recursively force)は、フォルダの配下のすべてのサブフォルダとファイルを削除します。読み取り専用のファイルがあった場合でも警告せず強制的に削除します。
特に、rm_rfは実行して読み取り専用のファイルがあった場合でも何の警告も出さずに強制的に削除するため注意が必要です。
Fileutilsで rm、rm_r、rm_rf を実行する
rubyのFileUtilsでファイルやフォルダを削除するメソッドは、UNIX/Linuxのコマンドラインで使用するコマンドと全く同じです。
[FileUtilsのメソッド]
コマンド | コマンドの意味 |
---|---|
FileUtils.rm(target) | targetのファイルを削除する。読み取り専用のファイルは削除できない。 |
FileUtils.rm_f(target) | targetのファイルを削除する。読み取り専用のファイルも強制的(Force)に削除する。 |
FileUtils.rm_r(target) | targetのフォルダを削除する。読み取り専用のファイルやフォルダは削除できない。rは再帰的(Recursive)にフォルダをたどるという意味。 |
FileUtils.rm_rf(target) | targetのフォルダを削除する。読み取り専用のファイルも強制的(Force)に削除する。 |
UNIX/LinuxのコマンドラインでFileUtilsと同等のことを行うには、以下のようにコマンドを実行します。
$ # ファイルをコピーする $ # ファイルを削除する $ rm .bashrc_backup $ # ファイルを強制的に削除する $ rm -f .bash_history_backup $ # フォルダを配下のサブフォルダやファイル丸ごと削除する $ rm -r /app_v1.0.2 $ # フォルダを配下のサブフォルダやファイル丸ごと強制的に削除する $ rm -rf ./app_v0.9.10
RubyのFileUtilsメソッドを使ってファイルやフォルダを操作する実際のコードは、以下のようになります。
FileUtilsのメソッドはすべて対応するUNIX/Linuxコマンドと同等のファイル操作を行います。
require 'Fileutils' # ファイルを削除する FileUtils.rm(".bashrc_backup") # ファイルを強制的に削除する FileUtils.rm_f(".bash_history_backup") # フォルダを配下のサブフォルダやファイル丸ごと削除する FileUtils.rm_r("./app_v1.0.2") # フォルダを配下のサブフォルダやファイル丸ごと強制的に削除する FileUtils.rm_rf("./app_v0.9.10")
その他Fileutilsの便利なコマンド
touchでファイルを更新する方法
FileUtilsのtouchメソッドは、もともとUNIX/Linuxのコマンドラインのtouchコマンドが由来です。
URL:Linuxコマンド集 – 【 touch 】 ファイルのタイム・スタンプを変更する:ITpro
touchコマンドは、以下のことをファイルに対して行います。
- 引数に指定したファイルが存在しない場合は、新規に空のファイルを作成する
- 引数に指定したファイルが存在する場合は、そのファイルの更新日付を現在の日時にする
実際にコードを見てみましょう。
require 'Fileutils' # app_log_fileを新規作成するか存在すれば更新日付を最新に FileUtils.touch("app_log_file")
以上のコードのように、引数に指定したファイルが新規作成されるか、その更新日付が最新になります。
cmpでファイルを比較する方法
FileUtilsのcmpメソッドも、もともとはUNIX/Linuxのコマンドラインのcmpコマンドが由来です。
URL:LinuxコマンドTips(106):【 cmp 】コマンド――ファイルを1バイトずつ比較する – @IT
cmpメソッドは、引数に指定した2つのファイルの内容を比較し、一致していればtrue、一致していない場合はfalseを返します。
require 'Fileutils' # ファイルapp_log_2020_0401とapp_log_2020_0401の内容を比較する p FileUtils.cmp("app_log_2020_0401","app_log_2020_0402") #=> true # ファイル/etc/my.cnfと/etc/passwdの内容を比較する p FileUtils.cmp("/etc/my.cnf", "/etc/passwd") #=> false
以上のコードのように、引数に指定した2つのファイルの内容が一致するかどうかを確認できます。
exists?でファイルの存在を確認する方法
FileUtilsには、ファイルやフォルダが存在するかどうか確認するメソッドは存在しません。
そこで、別途、FileTest.exists?メソッドにて代用します。
FileTest.exists?メソッドは引数に指定したファイルやフォルダが存在する場合trueを返し、存在しない場合falseを返します。
# カレントフォルダのapp_v1.0.2というファイルかフォルダが存在するかどうかを確認する p FileTest.exists?("./app_v1.0.2") #=> 存在していればtrue、そうでなければfalse #/etcというファイルかフォルダが存在するかどうかを確認する p FileTest.exists?("/etc") #=> 存在していればtrue、そうでなければfalse
以上のコードのように、引数に指定したファイルやフォルダが存在するかどうかを確認できます。
pwdで現在のディレクトリを確認する
現在のディレクトリを確認するにはそのままUnix/Linuxコマンドのpwdが使えます。
(pwd = Print Working Directory = 作業ディレクトリを出力する)
require 'Fileutils' p FileUtils.pwd
それぞれの環境での作業ディレクトリの絶対パスが出力されます。
mvでファイルを移動する
ファイルを移動させるにはそのままUnix/Linuxコマンドのmvが使えます。
mvはmoveの略で、第一引数には移動したいファイル、第二引数には移動先を指定します。
例えば、sample.rbというファイルをothersというディレクトリに移動するには以下のようにします。
require 'Fileutils' FileUtils.mv('sample.rb','others')
まとめ
いかがでしたでしょうか?
この記事では、rubyのFileutilsの使い方を解説しました。
Unix/Linuxコマンドを使えるようになることで、rubyの中だけでより多くの処理ができますね。
基本Unix/LinuxコマンドでできることはFileutilsから利用できるので、興味があるかたはこれを機にFileuitlsを極めてみてはいかがでょうか?
もしFileutilsについて忘れてしまったらこの記事を確認してくださいね!