gem の FileName の使う
重複しないように連番でファイル名を作成したり、 時刻を追加したファイル名、その他のフォーマットのファイル名を 生成するための ruby の小さな gem を作った。 gem にはFileName クラスと filename-create コマンドが 含まれている。
インストール
gem でインストールできる。
gem install filename
動作環境
ruby 1.9.2 で動作確認をしている。 ruby 1.8.7 だと可変長引数を使っているのでエラーが起こる。
ライブラリとしての使い方
require 'filename'
とする。FileName#create か FileName.create によって ファイル名を生成することができる。
連番のファイル名を作る
デフォルトでは連番でファイル名を作成する。
require 'filename'
filename = FileName.new('base.txt')
p filename.create(:add => :always) # => "/path/to/base.txt.00"
p filename.create(:add => :always) # => "/path/to/base.txt.01"
p filename.create(:add => :always) # => "/path/to/base.txt.02"
ベースとなるファイル名を与えて FileName.new(basename) として、 FileName#create を実行するたびにファイル名が作られる。 create のオプション「:add => :always」はファイル名に文字列(番号か時刻)をつねに付加するという指定。 デフォルトは :auto でもしファイルがすでに存在していると文字列を付加する。 また、:prohibit を指定すれば、ファイルが存在していても文字列を付加しない。
時刻を追加したファイル名を作る
require 'filename'
filename = FileName.new('base.txt', :type => :time)
p filename.create(:add => :always) # For example, returns "/path/to/base.txt.20110326_073247_078247"
FileName.new の :type オプションに :time を指定する。 デフォルトでは :number が指定されていて、連番を付加する。
ファイル名に文字列を付加するかどうかを指定する
require 'filename'
filename = FileName.new('base.txt')
# つねに "/path/to/base.txt.00" を返す
p filename.create(:add => :always)
# つねに "/path/to/base.txt" を返す
p filename.create(:add => :prohibit)
# ファイルが存在していれば "/path/to/base.txt.00" そうでなければ "/path/to/base.txt"
p filename.create(:add => :auto)
文字列を付加する場所を指定する
:position でどこに文字列を付加するかを指定する。値は :suffix、:prefix、:middle の いずれかを指定する。 デフォルトでは :suffix で末尾に付加される。
require 'filename'
filename = FileName.new('base.txt', :position => :suffix)
p filename.create(:add => :always) # => "/path/to/base.txt.00"
filename = FileName.new('base.txt', :position => :prefix)
p filename.create(:add => :always) # => "/path/to/00_base.txt"
filename = FileName.new('base.txt', :position => :middle)
p filename.create(:add => :always) # => "/path/to/base_00.txt"
区切り文字を指定する
区切り文字の標準は :position => :suffix のときは “.” で、そうでないときは “_“。 変更するには :delimiter オプションで指定する。
require 'filename'
filename = FileName.new('base.txt', :position => :prefix, :delimiter => '')
p filename.create(:add => :always) # => "/path/to/00base.txt"
filename = FileName.new('base.txt', :position => :prefix, :delimiter => '-')
p filename.create(:add => :always) # => "/path/to/00-base.txt"
拡張子を変更する
ベースのファイル名とは異なる拡張子に変えるには、 オプション :extension で指定する。
require 'filename'
filename = FileName.new('base.txt')
p filename.create(:add => :always, :extension => 'log') # => "/path/to/base.log.00"
親ディレクトリを作成する
:directory オプションを :parent にするとファイル名を作成したときに親ディレクトリを作成する。
require 'filename'
filename = FileName.new('dir/base.txt')
p filename.create(:add => :always, :directory => :parent) # Create 'dir' directory.
作成したファイル名のディレクトリを作る
:directory オプションを :self にすると作成されたファイル名のディレクトリを作成する
require 'filename'
filename = FileName.new('dir1/dir2')
p filename.create(:add => :always, :directory => :self) # Create 'dir1/dir2' directory.
空のファイルを作る
:file オプションで作成されたファイル名の空のファイルを作成する。 :write を指定するとファイルが存在しない場合に空のファイルを作る。 :overwrite ならばファイルが存在していても上書きしてからのファイルを作る。
require 'filename'
filename = FileName.new('path/to/file')
p filename.create(:file => :write) # Create empty file 'path/to/file' if 'path/to/file' does not exist.
p filename.create(:file => :overwrite) # Create empty file 'path/to/file' even if 'path/to/file' exists.
最初の番号と桁数を指定する
ファイル名に番号を付加する場合、最初の番号と桁数を指定することができる。 それぞれ、:start、:digit オプションで指定する。
require 'filename'
filename = FileName.new('base.txt', :digit => 4, :start => 1000)
p filename.create(:add => :always) # => "/path/to/base.txt.1000"
p filename.create(:add => :always) # => "/path/to/base.txt.1001"
連番のフォーマットを変更する
:format オプションで文字列を指定した場合、sprintf のフォーマットとして使用される。 Fixnum を引数にとる Proc オブジェクトを指定した場合は、 その Proc オブジェクトが評価されて付加する文字列に使用される。
require 'filename'
filename = FileName.new('base.txt', :format => "@%03d@")
p filename.create(:add => :always) # => "/path/to/base.txt.@000@"
filename = FileName.new('base.txt', :type => :time, :format => lambda { |n| sprintf("%03d", n * n) })
p filename.create(:add => :always) # => "/path/to/base.txt.100"
p filename.create(:add => :always) # => "/path/to/base.txt.121"
時刻のフォーマットを変更する
番号の場合と同様に文字列か Proc オブジェクトを :format オプションに指定する。 文字列の場合は Time#strftime のフォーマットとして使用され、 Proc オブジェクトの場合は時刻を引数にとって評価によって得られた文字列が使用される。
require 'filename'
filename = FileName.new('base.txt', :format => "%H%M%S")
p filename.create(:add => :always) # For example, returns "/path/to/base.txt.075130"
filename = FileName.new('base.txt', :start => 10, :format => lambda { |t| t.usec.to_s })
p filename.create(:add => :always) # For example, returns "/path/to/base.txt.849963"
:format オプションで変数を使用する
:data オプションにハッシュを与えると それらがインスタンス変数として保存される。 これらのインスタンス変数は :format オプションに指定した proc オブジェクトの 中で使用することができる。
require 'filename'
filename = FileName.new('base.txt', :data => { :a => 3 },
:format => lambda { |n| s = sprintf("%03d", @a * n); @a += 2; s })
p filename.create(:add => :always) # => "/path/to/base.txt.000"
p filename.create(:add => :always) # => "/path/to/base.txt.005"
p filename.create(:add => :always) # => "/path/to/base.txt.014"
上の例では、:data オプションで「@a = 3」という変数 @a が用意され、 :format オプションで指定された proc オブジェクトの中で @a が使用されている。
FileName#new, FileName#create, FileName.create のオプション
FileName#create のオプションを FileName#new に指定した場合、 FileName#create のオプションのデフォルト値となる。 ファイル名を作成するときにオプションを変更したい場合は FileName#create にオプションを与えれば良い。 また、FileName.create のオプションは FileName#new と同じ。
filename-create コマンド
シェルで利用するために filename-create コマンドを追加した。
使い方の基本とオプション
filename-create new basename
とすると、作成されたファイル名が表示される。 FileName#create の引き数に対応するオプションがある。 「–cache」だけコマンド専用の機能である。 また、FileName#create の :format で Proc を指定した場合に 対応するオプションはない。
-s, --start NUM Set the starting number.
-i, --digit NUM Set the digit of number.
-d, --delimiter STR Set the delimiter string: number or time.
-n, --no-delimiter Do not use delimiter.
-t, --type TYPE Set the type of additional part.
-f, --format STR Set the format string.
-p, --position POS Set the position of addition: prefix, suffix, or middle.
-P, --path TYPE Set the type of path: absolute or relative.
-e, --extension STR Set the extension string.
-a, --add STR Change the behavior of addition: always, auto, or prohibit.
-D, --directory STR Create directory: self or parent.
-F, --file STR Create an empty file: write or overwrite.
-c, --cache KEY Create cache for command "new" and "config".
キャッシュ
連番で生成したい場合は、まず、キャッシュを作る。
filename-create new basename --cache cache_name
cache_name という名前でキャッシュを参照できる。 オプションを指定したい場合は、このときに指定しておく。 生成したキャッシュからファイル名を生成するには
filename-create cache cache_name
とする。続けて実行すると連番でファイル名を生成することができる。
使い終わったら
filename-create delete_cache cache_name
でキャッシュを削除する。 また、保存されているキャッシュの一覧を見るには
filename-create list_cache
とする。
生成規則の設定を保存しておく
~/.filename_gem/conf 以下に FileName#create のオプションを表す Ruby のハッシュを記述したファイルを保存しておくと、 「filename-create config」でその設定を使用して ファイル名を生成する。 ~/.filename_gem/conf/sample.rb にハッシュが保存されているとすると、
filename-create config sample
のようにする。 また、「fiilename-create new」と同じように 「–cache」オプションをつけて実行すると キャッシュが作られる。
License
ライセンスは GPLv3 で詳しくは LICENSE.txt を参照してください。