バナー画像

前記事「【Ruby入門】入力と出力」では、標準入出力やファイルへの出力を解説しました。

本記事では、ファイルやフォルダ(注1)の操作を解説します。

ファイルの操作、つまりファイルの作成や移動、コピー、削除を解説します。

本記事を十分理解できれば、複雑なファイルやフォルダの操作をコマンドひとつでできるようになったり、さらにはサーバー側のバッチ処理(注2)も実装可能ですよ!

(注1)WindowsやMacではフォルダと呼びますが、Unix系ではディレクトリといいます。

(注2)開始から終了まで人手を介することのない自動処理をバッチ処理といいます。

ファイルの作成

ファイルの作成は、すでに前記事「【Ruby入門】入力と出力」で解説しましたので、おさらいにサラッと見てみましょう。

新規にファイルを作り、その中にabcdeという文字列を書き込みましょう。

File.open("sample1.txt", "w") do |io|
  io.puts "abcde"
end

sample1.txtというファイル名でファイルができ、中身はabcdeという文字列が書き込まれます。

ファイルの移動

ファイルを移動してみましょう。

現在の場所から「back」というフォルダに移動してみます。

移動というよりは、Fileクラスのrenameメソッドを使い、移動先のパスを指定するというイメージです。

実際に試す前に、現在のフォルダの中にbackというフォルダを作っておいてください。

File.rename("sample1.txt","back/sample1.txt")

上記を実行後、backというフォルダにファイルが移動されているのがわかります。

実際に実行するときには、以下を守る必要がありますので注意してください。

例えば上記をsample.rbというファイル名で実行する場合です。

 

 

また、ライブラリfileutilsを使っても可能です。

require "fileutils"

FileUtils.mv("sample1.txt","back/sample1.txt")

いずれの方法も、同じファイル名で移動しましたが、移動と同時にファイル名を変えることも可能です。

require "fileutils"

FileUtils.mv("sample1.txt","back/sample1_1.txt")

こうすれば、移動と同時にファイル名がsample1_1.txtに変更されます。

もうちょっとアレンジして、日付を含んだファイル名でコピーしてみましょう。

require "fileutils"

t = Time.now
filename = "back/sample1_" + t.strftime("%Y%m%d") + ".txt"

FileUtils.cp("sample1.txt",filename)

これで、実行時が2017年11月29日ならば、backというフォルダに「sample1_20171129.txt」というファイル名で移動できます。

ファイルのコピー

ファイルのコピーも、fileutilsを使います。

require "fileutils"

FileUtils.cp("sample1.txt","back/sample1.txt")

ここもちょっと工夫して、同じフォルダに2から10まで連番をつけてファイルをコピーしてみましょう。

require "fileutils"

(2..10).each do |i|
	FileUtils.cp("sample1.txt","sample" + i.to_s + ".txt")
end

sample2.txtからsample10.txtが作成されます。

特定のフォルダの中身をすべてコピー

今までの解説は、すべて1本のファイルばかりでした。では特定のフォルダ以下すべてを選択するにはどうすればよいでしょうか?

Dir.globを使うと、指定したフォルダ内のファイル名が、リスト形式で得られます。

以下を実行してみてください。

require "fileutils"

puts Dir.glob('*.*')

ソースファイルが存在しているフォルダのファイル名の一覧が表示されたはずです。

フォルダを指定したい場合は、Dir.chdirでカレントディレクトリを変更します。’フォルダ’は、お使いの環境に合わせて変更してください。

require "fileutils"

Dir.chdir 'フォルダ'
puts Dir.glob('*.*')

*.*で、ファイル名や拡張子ともにワイルドカードを指定していますので、指定したフォルダ以下すべてが対象となっています。

もちろん、ファイル名や拡張子を指定して、対象を絞ることも可能です。

早速、ソースファイルがあるフォルダ内部のファイルをすべてコピーしてみましょう。

require "fileutils"

Dir.glob('*.*').each do |filename|
	FileUtils.cp(filename, "back/" + filename)
end

フォルダ内部のファイルがすべて、同一フォルダ内のbackフォルダにコピーされます。

何も考えず、特定のフォルダから別のフォルダにコピーするだけなら、FileUtils.cp_rを使います。

require "fileutils"

FileUtils.cp_r(Dir.glob('*.*'), "back/")

これで、ソースファイルの直下のすべてが、backフォルダへとコピーされます。

またfileutilには、cp_rに限らず「_r」がついたコマンドがいくつかあります。これは再帰的という意味を持ちます。

フォルダの中身全部、という意味になります。

便利なので覚えておきましょう。

ファイルの削除

削除もfileutilsのFileUtils.rmを使います。

まずは基本形です。

FileUtils.rm("sample1.txt")

フォルダ以下すべてを削除

ソースファイルの存在しているフォルダの中身を、すべて削除します。

require "fileutils"

Dir.glob('*.*').each do |filename|
	FileUtils.rm(filename)
end

上記をそのまま実行すると、ソースファイルのあるフォルダの中身、つまりソースファイルまで消えるのでご注意ください。

特知恵のフォルダを指定したい場合は、コピーの節で出てきた「Dir.chdir」をDir.globの前で実行してフォルダを変更してください。

まとめ

本記事では、Rubyによるファイルの操作について解説しました。

本記事でふれたfileutilsはもっとたくさんの機能を持っています。興味のある方はぜひ深掘りしてみてくださいね!

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。