Ruby ファイル・ディレクトリ操作 スクリプトの書き方

スポンサーリンク

バイオインフォ道場、くまぞうです。

スクリプトを書く時、1つのファイルについて処理が完成したら他のファイルでも使えるように機能を拡張したくなります。また、ファイルの有無やその属性情報によって処理を変更することは良くあります。情報の再利用やデフォルト値・パラメータの保存・バックアップなどを考慮する必要があるかもしれません。ファイルやディレクトリの処理をスクリプト中で行えるようになると便利です。

スポンサーリンク



ファイル情報の利用

ファイル名・パス・属性、作成日・最終アクセス日時など様々な情報を活用しましょう。

Fileクラスを使ってファイル情報を取得する

ファイルの情報を利用する場合は、Fileクラスを利用します。ファイル名やパスの情報、ファイル情報の詳細を取得することができます。Fileクラスの各種メソッド(File.exist?File.size)を呼び出して必要な情報を得る方法や、File.statでいっぺんに情報を取得する方法などがあります。尚、ファイルの読み・書きもFileクラスで行います。

file1.rb

#! /usr/bin/ruby

# File情報を利用する
file = ARGV[0]
abort "not found #{file}" if !File.exist?(file)  # Fileクラス

dirname  = File.dirname(file)
extname  = File.extname(file)
basename = File.basename(file, extname)
backup   = File.join(dirname, basename+"_2"+extname)

File.copy_stream(file, backup) # ファイルの複製

s = File.stat(file)  # File::Statを利用して、効率的に情報を得る
title = "FILE INFORMATION"
printf "%s\n%s\n", title, '-'*title.size

puts "  name : #{file}"
puts "  size : #{s.size}"
puts " mtime : #{s.mtime}"
puts " write : #{s.writable?}"
puts "backup : #{backup}"
$ ls myapp*
myapp.txt

$ cat myapp.txt
aaa bbb

$ ruby file1.rb

FILE INFORMATION
----------------
  name : myapp.txt
  size : 8
 mtime : 2016-10-01 19:45:46 +0900
 write : true
backup : ./myapp_2.txt

ファイルリストの利用

あるディレクトリ内に存在するファイル、条件で絞り込んだファイルなどのリストを取得して活用しましょう。

Dirクラスを使ってファイルリストを取得する

ある条件で絞り込んだファイルを取得・利用する場合は、Dirクラスを利用します。Dir['*.*']は、[]内で絞り込んだ条件に合致したファイル名を配列として利用可能です。Dir.glob('*.*')は、更にブロックを活用できる点でとても使いやすいです。

file2.rb

#! /usr/bin/ruby

# ファイルリストを活用する
puts Dir['myapp*'].join(', ')
puts

# ファイルリストを活用する(個々にブロックを活用)
Dir.glob('myapp*') do |f|
  s = File.stat(f)
  puts "  name : #{f}"
  puts "  size : #{s.size}"
  puts " mtime : #{s.mtime}"

  File.open(f).each do |line|
    puts "#{$.}:"+line.chomp
  end
  puts
end
$ ls myapp*
myapp.txt  myapp_2.txt

$ ruby file2.rb
myapp.txt, myapp_2.txt

  name : myapp.txt
  size : 8
 mtime : 2016-10-01 19:45:46 +0900
1:aaa bbb

  name : myapp_2.txt
  size : 8
 mtime : 2016-10-13 19:03:38 +0900
1:aaa bbb
スポンサーリンク



タイトルとURLをコピーしました