前回、デジカメやスマホで撮った写真は全部PCに突っ込んで、ファイル名は撮影日時にリネームしてるという話を書きました。(Rubyでファイル名を更新日時にする)

ところで、そうやって整理した写真フォルダをiTunesでiPhoneに同期すると、なぜかアルバム内の写真の順番がバラバラになってしまいます。こちらとしては、単純にファイル名の昇順か、あるいはExifヘッダの撮影日時順にでも並んでくれれば文句はないのですが、iPhoneの「写真」アプリはなぜかファイルの更新日時順に画像を並べてしまうようなのです。(ちなみに、同じフォルダをiPadに同期すると、どういうわけか、こちらは期待通りに並んでくれます。きっとiPhone版とは実装が異なるのでしょう)

更新日時と撮影日時なんてほとんどの場合は同じだから問題ないだろう、と思われるかもしれませんが、iPhoneの「写真」アプリで編集機能を使った場合などには、更新日時が書き変わってしまいます。たとえ「オリジナルに戻す」操作をしても更新日時は戻らず、むしろその戻し操作をした日時に書き変わってしまいます。私の場合、写真をトリミングしてTwitterに載せたあと「オリジナルに戻す」という操作をわりと頻繁にするので、そういう写真の並び順が狂ってしまいます。

対処としては、ファイルの更新日時をExifヘッダの撮影日時に書き換えてやれば、とりあえずiPhoneでも期待した順番で表示されるようにはなるのですが、素のWindowsでは更新日時を書き換えることはできませんし、UNIX系OSのtouchコマンドなどで書き換えるにしても、ひとつずつ手動でというのは非現実的です。前回紹介したJHeadで撮影日時を取得できることは分かっていたので、ここはまたRubyか何かで更新日時を書き換えるスクリプトでも作るかと思ってJHeadのマニュアルを眺めていたら……。

あるじゃないですか、jheadコマンドのオプションに、そのものズバリ、ファイルの更新日付を撮影日付に書き換えるという素晴らしいものが!! 使い方は簡単で、「jhead -ft」の引数に対象ファイルを指定するだけです。ちなみに、JPEG以外のファイルを指定しても、「Not JPEG」と言って無視されます。

$ ls -l
total 28739
-rw-r--r--  1 alpha  alpha    881211  8月 22 15:22 20150801-194354.jpg
-rw-r--r--  1 alpha  alpha   1228730  8月 22 15:22 20150802-234113.jpg
-rw-r--r--  1 alpha  alpha    982529  8月 22 15:22 20150803-214830.jpg
-rw-r--r--  1 alpha  alpha    209706  8月  7 20:31 20150807-203145.png
-rw-r--r--  1 alpha  alpha  25697551  8月 14 21:44 20150814-214405.mov
$ jhead -ft *
20150801-194354.jpg
20150802-234113.jpg
20150803-214830.jpg
Not JPEG: 20150807-203145.png
Not JPEG: 20150814-214405.mov
$ ls -l
total 28739
-rw-r--r--  1 alpha  alpha    881211  8月  1 19:43 20150801-194354.jpg
-rw-r--r--  1 alpha  alpha   1228730  8月  2 23:41 20150802-234113.jpg
-rw-r--r--  1 alpha  alpha    982529  8月  3 21:48 20150803-214830.jpg
-rw-r--r--  1 alpha  alpha    209706  8月  7 20:31 20150807-203145.png
-rw-r--r--  1 alpha  alpha  25697551  8月 14 21:44 20150814-214405.mov

痒いところに手が届くJHead、素晴らしい!

※バージョンメモ

  • iOS 8.4.1
  • FreeBSD 10.1-RELEASE-p18 amd64
  • jhead-3.00