ファイル名を一括変換したくなったので、テンプレ的な Ruby スクリプトを書いてみた。

新しいファイル名を返す関数 get_new_file_path をカスタマイズして使う。


#!/usr/bin/env ruby

# 新しいファイル名を返す
def get_new_file_path(src_file_path)

  if !File.directory?(src_file_path)
    # 新しいファイル名を生成する
    dir  = File.dirname(src_file_path)
    base = File.basename(src_file_path, ".*")
    ext  = File.extname(src_file_path)
    # "#{dir}/#{base}#{ext}" は元のファイル名と同じ
    return "#{dir}/#{base}#{ext}"
  else
    # ディレクトリの場合はリネームしない
    raise "Not file."
  end
end

# ファイル名を変更する 
def rename(src_file_path, new_file_path)

  if !File.exist?(new_file_path)
    File.rename(src_file_path, new_file_path)
  else
    # リネーム先にファイルが存在する場合はリネームしない
    raise "Exist new file path."
  end
end

# 指定されたファイルの処理をする 
ARGV.each{|filepath|

  begin

    # 新しいファイル名を求める
    new_file_path = get_new_file_path(filepath)

    # ファイル名を変更する
    rename(filepath, new_file_path)

    # success
    puts "rename: #{filepath} -> #{new_file_path}"

  rescue => e

    # failure or untouched
    puts "keep: #{filepath} (#{e.message})"

  end
}

# 引数が足りない場合はヘルプを表示 
if ARGV.size < 1
  puts "Usage: #{File.basename(__FILE__)} <files>"
end

パスの通ったところに mv.rb みたいなファイル名で置いて、


$ ruby mv.rb *.jpg

みたいに実行して、コマンドラインでファイル名を一括変換できる。

ファイル名の後ろに _hoge って付けてリネームする実行例。


$ ruby mv.rb *
rename: aaa0001.jpg -> ./IMG0001_hoge.jpg
rename: aaa0002.jpg -> ./IMG0002_hoge.jpg
keep: abc.jpg (Exist new file path.)
rename: abc_hoge.jpg -> ./abc_hoge_hoge.jpg
keep: didi (Not file.)

リネームできたら rename と表示。リネームできなかったら keep と表示する。

ファイル名の一括変換スクリプトはたまに書くけど、テンプレ的なものがあると便利かなと思う。

tags: ruby

Posted by NI-Lab. (@nilab)