ディレクトリ内のファイルを作成時刻でソートして連番をつけてリネームする

という感じのブログを見つけたので自分だったらどうやるかなぁと思ってやってみる。

前提

とりあえず上のブログを見習って、なるべく限定的な条件にして、お手軽にくむ

  • 再帰的にディレクトリを辿るとかいらない。
  • リネーム対象はファイルのみ
  • 拡張子はリネーム後でも変わらずに
  • リネームする時のフォーマットは、決めうちで
  • ソートは昇順のみで良い
  • バックアップとかも考慮いれない

こうした

#!/usr/bin/env python
# coding: utf-8 

import os
import sys
import stat

DIR_PATH = "/Users/hogehoge/hogehoge" 
RENAME_PATTERN = "IMG_%05d%s"

if __name__ == "__main__":
    if not os.path.isdir(DIR_PATH): 
        sys.exit("ERROR: '%s' is not directory." % DIR_PATH)

    index = 0 
    (root, dirs, files) = next(os.walk(DIR_PATH.rstrip(os.sep))) 
    targets = dict([(os.stat(os.path.join(root, f)).st_ctime, f) for f in files])
    for st_ctime, filename in sorted(targets.items()): 
        index += 1
        (name, ext) = os.path.splitext(filename) 
        os.rename(os.path.join(root, filename), os.path.join(root, RENAME_PATTERN % (index, ext)))

余談

  • ディレクトリセパレータは os.sepでとれる事をしった
  • os.path.splitextも初めてしった。

追記(2012/02/05)

  • 海原雄山なのか戦国大名なのか段々見分けるのが困難になってきた御館様(id:imagawa_yakata)に下記のようにTwitterで教えてもらいました。いつもありがとうございます。m( _ _ )m
  • といわけで上記のコードを下記のように修正しました。
-    (root, dirs, files) = os.walk(DIR_PATH.rstrip(os.sep)).next()  
+    (root, dirs, files) = next(os.walk(DIR_PATH.rstrip(os.sep)))