ファイル名を一括変換したくなったので、テンプレ的な 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 と表示する。
ファイル名の一括変換スクリプトはたまに書くけど、テンプレ的なものがあると便利かなと思う。
- [ヅ] Rubyでファイル名に日時っぽい文字列があったらファイル名を「年月日_時分秒.拡張子」なファイル名に変更する (2014-07-30)
- [ヅ] Ruby + RMagick で Exif 撮影日時にリネームする (2012-03-21)
- [ヅ] 「2007」ではじまるファイル名を「2008〜」にリネームするRubyスクリプト (2012-07-18)
- [ヅ] Rubyでディレクトリ階層にあるファイルをフラットにコピー (2012-03-31)
- [ヅ] AWK でファイルに連番を振って一括リネームするワンライナー (2011-10-09)
- [ヅ] bashでファイルに連番を振って一括リネームするワンライナー (2011-10-10)
tags: ruby
Posted by NI-Lab. (@nilab)