[ダウンロード|English page]

reloc-exif

個人的流儀として、デジカメ写真はyyyy/mm/dd/filenameというディレクトリ構成で保存しています。
探せば適当なツールが見つかったんでしょうが、ちょうどPythonを勉強していることもあり、作ってみました。

改変履歴

2022年11月13日

ファイル名のencodeに失敗して異常終了する事象が発生したので無視して続行するよう改変しました。

2022年11月13日

作者の常用環境がPython 3に移行しているので、今後、Python 2版は更新しない予定です。

機能

reloc-exifといいます。
コマンドラインの構文は
reloc-exif [-fhn] [src | src1[... srcN] dst]
です。 srcがファイルのときはdst/yyyy/mm/dd/srcに移動します。srcがディレクトリだったらsrc以下のファイルを処理します。
yyyy/mm/ddはタイムスタンプにより決定します。タイムスタンプは、EXIFのデータ(正確にはDataTimeOriginal)から得られれば、それを使いますし、得られなかった場合には、-fオプションを与えて起動すれば、代わりにOSのタイムスタンプ(mtime)を使い、与えなければsrcは移動せず、そのままの位置に残します。
reloc-exifは3つのオプションを解釈します。-fは上で述べた通りです。-hはヘルプオプションです。-nはdry runで、srcをどのように移動するかを表示するだけで実際には移動しません。
reloc-exifは3つのオプション以外に0個またはそれ以上の引数を受理します。
引数がなければ、srcとしてはDCIMが、またdstとしてはカレントディレクトリが用いられ、DCIM以下のファイルを./yyyy/mm/dd/filename.jpgに移動します。
引数が1個だったら、その引数はsrcと解釈し、dstとしては、やはりカレントディレクトリが用いられます。
引数が2個以上だったら、最後の1つをdstとして解釈し、残りはsrcとして解釈します。
ファイルの移動はrename()で実装しているので、ファイルシステムをまたいだ移動はできません。作者は困っていないので、改修の計画はありません。もし画像を直接フラッシュからハードディスクに移動したいようでしたら、コピー(とunlinkも?)するルーチンを追加して下さい。

以下のようなディレクトリとファイルがあるとしましょう。

-+- tmp1 --- DCIM -+- photo1.JPG
 |                 |- photo2.JPG
 |
 +- tmp2 --- DCIM -+- photo3.JPG
 |                 |- movie1.AVI
 |
 +- My Pictures

注意深くいくなら、reloc-exifに-nオプションをつけてdry runモードで起動してみましょう。

% reloc-exif -n tmp1 tmp2 My\ Pictures
tmp1/DCIM/photo1.JPG -> My Pictures/2008/09/07/photo1.JPG
tmp1/DCIM/photo2.JPG -> My Pictures/2008/09/07/photo2.JPG
tmp1/DCIM/photo3.JPG -> My Pictures/2008/09/19/photo3.JPG
tmp2/DCIM/photo4.JPG -> My Pictures/2008/09/20/photo4.JPG
tmp2/DCIM/movie1.AVI: Can't obtain EXIF DataTimeOriginal, so leave it.
tmp2/DCIM/photo5.JPG -> My Pictures/2008/09/27/photo5.JPG

ありゃりゃ。それではmovie1.AVIについてはOSのタイムスタンプを使うように-fをつけてみましょう。

% reloc-exif -nf tmp1 tmp2 My\ Pictures
tmp1/DCIM/photo1.JPG -> My Pictures/2008/09/07/photo1.JPG
tmp1/DCIM/photo2.JPG -> My Pictures/2008/09/07/photo2.JPG
tmp1/DCIM/photo3.JPG -> My Pictures/2008/09/19/photo3.JPG
tmp2/DCIM/photo4.JPG -> My Pictures/2008/09/20/photo4.JPG
tmp2/DCIM/movie1.AVI: Can't obtain EXIF DataTimeOriginal, so use OS time stamp instead.
tmp2/DCIM/movie1.AVI -> My Pictures/2008/09/14/movie1.AVI
tmp2/DCIM/photo5.JPG -> My Pictures/2008/09/27/photo5.JPG

-fオプションをつけてみたら、reloc-exifはmovie1.AVIを2008/09/14に移動しようとすることがわかりました。もしこれが妥当な日付だったら、作業を続けましょう。

% reloc-exif -f tmp1 tmp2 My\ Pictures
tmp1/DCIM/photo1.JPG -> My Pictures/2008/09/07/photo1.JPG
tmp1/DCIM/photo2.JPG -> My Pictures/2008/09/07/photo2.JPG
tmp1/DCIM/photo3.JPG -> My Pictures/2008/09/19/photo3.JPG
tmp2/DCIM/photo4.JPG -> My Pictures/2008/09/20/photo4.JPG
tmp2/DCIM/movie1.AVI: Can't obtain EXIF DataTimeOriginal, so use OS time stamp instead.
tmp2/DCIM/movie1.AVI -> My Pictures/2008/09/14/movie1.AVI
tmp2/DCIM/photo5.JPG -> My Pictures/2008/09/27/photo5.JPG

結果は

-+- My Pictures --- 2008 --- 09 -+- 07 -+- photo1.JPG
 |                               |      +- photo2.JPG
 |                               |
 |                               +- 14 --- movie1.AVI
 |                               |
 |                               +- 19 --- photo3.JPG
 |                               |
 |                               +- 20 --- photo4.JPG
 |                               |
 |                               +- 27 --- photo5.JPG
 |
 +- tmp1 --- DCIM ---
 |
 +- tmp2 --- DCIM ---

となります。-fオプションをつけずに実行すれば、movie1.AVIはtmp2/DCIMに残ります。

% reloc-exif tmp1 tmp2 My\ Pictures
tmp1/DCIM/photo1.JPG -> My Pictures/2008/09/07/photo1.JPG
tmp1/DCIM/photo2.JPG -> My Pictures/2008/09/07/photo2.JPG
tmp1/DCIM/photo3.JPG -> My Pictures/2008/09/19/photo3.JPG
tmp2/DCIM/photo4.JPG -> My Pictures/2008/09/20/photo4.JPG
tmp2/DCIM/movie1.AVI: Can't obtain EXIF DataTimeOriginal, so leave it.
tmp2/DCIM/photo5.JPG -> My Pictures/2008/09/27/photo5.JPG

このとき、結果は

-+- My Pictures --- 2008 --- 09 -+- 07 -+- photo1.JPG
 |                               |      +- photo2.JPG
 |                               |
 |                               +- 19 --- photo3.JPG
 |                               |
 |                               +- 20 --- photo4.JPG
 |                               |
 |                               +- 27 --- photo5.JPG
 |
 +- tmp1 --- DCIM ---
 |
 +- tmp2 --- DCIM --- movie1.AVI

となります。tmp2/DCIM/movie1.AVIは手動で適当なところへ移動しましょう。

インストールと依存するソフトウェア

Python 3

Python
reloc-exifはPythonで記述されています。
exif-py
https://github.com/ianare/exif-pyで配布されているexif-pyに依存しています。
作者の環境は次の通りです。
OSPythonexif-py
FreeBSD 12.3/amd64pkgでインストールした3,8.15pkg(py38-ExifRead)でインストールした2.1.2
Ubuntu 22.04.01 LTSUbuntu標準の3.10.6apt(python3-exifread)でインストールした2.3.2-1

Python 2

作者の常用環境がPython 3に移行しているので、今後、Python 2版は更新しない予定です。
Python
reloc-exifはPythonで記述されています。開発時の作者の環境はFreeBSD 8.2/amd64にportsでインストールしたPython 2.6.5でした。
exif-py
EXIF.pyに依存しています。開発時に作者が使ったのは1.0.8です。現在はhttps://github.com/ianare/exif-pyで配布されているexif-pyに含まれています。
tar ballをダウンロードして展開します。それからconfigureを実行します。configureには--with-exif-py=DIRオプションを与えることができます。このオプションを与えなかったときのexifreadあるいはEXIF.pyの存在チェックはまだ実装していませんので(した方がいいですよね)、Pythonがちゃんとexifread(Python 3の場合)またはEXIF.py(Python 2の場合)を見つけられるように注意して下さい。
これでreloc-exifを使う準備ができたことと思います。
[software|Top page]
Last update: $Date:: 2022-11-13 15:47:15 +0900#$
Copyright 2011, 2019, 2022 Koh-ichi Ito, All rights reserved.