ファイルを更新時間順にソートしてリネームするプログラム



#!ruby -Ks

path = ARGV[0] #末尾に"\"を付加すること

fnames = Dir.entries(path)
fnames.delete_if { |x| /.*\.$/ =~ x }

fnames.sort! do |a, b|
File.stat(path + a).mtime.strftime("%Y%m%d%H%M%S") <=>
File.stat(path + b).mtime.strftime("%Y%m%d%H%M%S")
end

fnames.each_with_index do |fname, index|
File.rename(path + fname, path + "railgun" + sprintf("%02d", index + 1) + ".xxx")
end

■解説(追記)
  • 1行目はshebang*1です。コマンドラインオプションで-Ksを指定したのと同じ意味で、文字コードShift_JISに設定しています。
  • 5行目のDir.entriesで、指定したディレクトリの全てのファイル名を配列として取得しています。このメソッドは、"."と".."も取得してしまうようなので、6行目で削除しています。
  • 6行目の配列.delete_ifで、条件に当てはまった値を削除しています。ここでの条件は「末尾の文字が"."」です。
  • 8行目〜11行目で、条件を指定したソートを行っています。File.stat(ファイルのパス).mtimeでファイルの最終更新時間を取得し、strftimeで年月日時分秒を桁を合わせて繋げた文字列に変換して比較しています。
  • 13〜15行目で、リネームを行っています。each_with_indexは、イテレータを使いつつループ回数をカウントできてとても便利です。File.renameの引数は、rename(リネームするファイルパス, 新しいファイルパス)となっています。

■参考*1
シバン (Unix) - Wikipedia
http://www2.u-netsurf.ne.jp/~alt/mt/archives/20031116_1651.html
日本語文字列の文字数 / $KCODEよりも-Kオプションで - rubyco(るびこ)の日記