写真を整理したい

 2000年代半ばにフィルムカメラからデジカメに乗り換えて、ビデオカメラも DV テープから HDD, SD カードと変遷し、今では気軽に何でもスマホで撮るようになりました。おうち NAS には気付いたら 1Tbyte 弱ものデータがあります。

 普通にカシャっと撮った写真とビデオが中心ですが、誰かにシェアするとかいった目的でコピーした写真や、キャプチャ画像なんかもいっぱいあります。そういった写真は、あとでたまに目にした時に「これいつ頃のだっけ?」「覚えはあるんだよね、どこだっけ?」「アレの時でしょアレのとき」「アレって?」「ほらーアレだよアレ」ということに陥りがちで、困っていました。

 そんな折に、OpenCV を使えば、写真のなかから断片をマッチングできるらしい、と聞きました。画像から切り取った断片がどこにあるか、見つけてくれるそうです。これを使えば、キャプチャ元の写真や動画を特定できるかもしれません。

 そんなわけで目標は、おうち NAS に入っている写真から、キャプチャとコピーとその元画像・元動画を見つけることにしました。見つけたら、どう見せるようにしようかな。今はひとまず、シンボリックリンクでも置いとけばいいかな。あとでいいアイデア出てきたら変えよう。

 さて、そもそも対象ファイルをぐるっと巡る必要があるんだけど、いくつあるんだろう。OpenCVpython から呼んでる事例が多いので、WSL2 から NAS をマウントして、python でぐるっと巡ってみることにしました。python 何年ぶりだろ。覚えてないくらい昔なので、文法とかぐぐり直しながらになります。

 まずはその前に、NAS 上のフォルダ構成を観察してみます。

u939b$ cd とあるフォルダ
u939b$ ls -CFla
合計 4648
drwxrwxrwx  3 kashima users    4096  9月  6  2020  ./
drwxr-xr-x 33 kashima users    4096  4月 10 14:13  ../
drwxrwxrwx  3 kashima users    4096  9月  6  2020 '.@__thumb'/
-rw-rw-rw-  1 kashima users 1095488  9月  6  2020  IMG_0001.jpg
-rw-rw-rw-  1 kashima users 1076122  9月  6  2020  IMG_0002.jpg
-rw-rw-rw-  1 kashima users  791437  9月  6  2020  IMG_0003.jpg
-rw-rw-rw-  1 kashima users  845503  9月  6  2020  IMG_0004.jpg
-rw-rw-rw-  1 kashima users  897136  9月  6  2020  IMG_0006.jpg

 ファイル名が "." から始まるディレクトリがあるのね。Windows 絡みらしい。こういうのは除こう。もうひとつ、pathlib の Path クラスを使うと、ディレクトリ内のファイルをぐるっと for で巡れるらしい。

#!/usr/bin/env python3

from pathlib import Path

for file in Path(".").iterdir():
    if file.name[0] != ".":
        print(file)

 あぁ、サブディレクトリに対応してないや。あと、"." 以外にもいくつかの文字で始まるファイル名は、取り除いたほうがいいな。

#!/usr/bin/env python3

from pathlib import Path
from typing import Generator

def iterfile(path: Path) -> Generator[Path, None, None]:
    first = "" if path.name == "" else path.name[0]
    if first == "." or first == "@" or first == "_":
        return
    if path.is_file():
        yield path
    if path.is_dir():
        for child in path.iterdir():
            for item in iterfile(child):
                yield item

for file in iterfile(Path(".")):
    print(file)

 よしこれでサブディレクトリ対応 OK。次は写真ファイルだけを for で巡れるようにしてみよう。