matobaの備忘録

育児しながら働くあるエンジニアの記録

Pythonを使って、macOSのファイル作成日時を取得する

macOSのマシンを使っている。 ローカルのファイルを整理するスクリプトを書いていて、ファイルの作成日時を取得した時の話をする。

ローカルに大量の作業用ファイルがある

ある。作業用ファイルといってもいろんな種類があるが。 直近で言えば、私は考え事を整理するときにXmindを使っているのだが、XMindのファイルがたくさんある。 そして普通に多いので、整理したい。

「作成日付ごとにディレクトリを切って、そこに入れておきたいな」と思った。

Finderだとファイルの作成日時がある

知っての通り、Finderで見ると、ファイルにはファイルの作成日時が表示されている。 だから、行けるはずだろうと持ってスクリプトを書いてみた。Pythonである。

(「書いてみた」と言ったが、実際はClaudeに指示を出してスクリプトを出力し動作確認していた。)

しかし、何かうまくいかない。特定のファイルがFinderの作成日時と違うディレクトリに移動される。

os.path.getctimeを使っていた

そのスクリプトではファイルの作成日時を取得するために、Pythonのos.path.getctimeを確認していた。

docs.python.org

これが間違っている。

システムの ctime、Unix系など一部のシステムでは最後にメタデータが変更された時刻、Windows などその他のシステムでは path の作成時刻を返します。返り値はエポック (time モジュールを参照) からの経過時間を示す秒数になります。ファイルが存在しない、あるいはアクセスできなかった場合は OSError を送出します。

ctimeはUNIX系のシステムのファイルシステムの情報であるが、ファイルの作成日時ではない。ファイルシステムのメタデータの変更日時である。

じゃあ、どうすればいいのか?

ファイルシステムのメタデータの変更日時ではなくて、macOSのFinderで表示されている情報が欲しい。 と言うわけで調べてみた。

どうやらmacOSのファイルシステムに拡張メタデータがあり、それを見れば良さそうだ。

stackoverflow.com

Pythonで取得する方法を探す

上記のスタックオーバーフローでは、コマンドラインから取得している。 が、こう言うのはたいていライブラリがある。と思って探してみた。

github.com

あった。

さらにそこから、以下のライブラリを紹介されていた。

github.com

これが良さそうに見える。あとは、属性名が分かれば取得できそうだ。

必要な属性を探す

macOSの開発者ドキュメントを見ながら、ファイルのメタデータで、欲しいものを探す。

developer.apple.com

kMDItemContentCreationDate がそれっぽい。

developer.apple.com

Python経由で取得する

from osxmetadata import OSXMetaData, kMDItemContentCreationDate

def get_creation_date(file_path: str)-> datetime.datetime:
    md = OSXMetaData(file_path)
    creation_date = md.get(kMDItemContentCreationDate)
    return creation_date

できた。

めでたしめでたし。