macOSのマシンを使っている。 ローカルのファイルを整理するスクリプトを書いていて、ファイルの作成日時を取得した時の話をする。
ローカルに大量の作業用ファイルがある
ある。作業用ファイルといってもいろんな種類があるが。 直近で言えば、私は考え事を整理するときにXmindを使っているのだが、XMindのファイルがたくさんある。 そして普通に多いので、整理したい。
「作成日付ごとにディレクトリを切って、そこに入れておきたいな」と思った。
Finderだとファイルの作成日時がある
知っての通り、Finderで見ると、ファイルにはファイルの作成日時が表示されている。 だから、行けるはずだろうと持ってスクリプトを書いてみた。Pythonである。
(「書いてみた」と言ったが、実際はClaudeに指示を出してスクリプトを出力し動作確認していた。)
しかし、何かうまくいかない。特定のファイルがFinderの作成日時と違うディレクトリに移動される。
os.path.getctimeを使っていた
そのスクリプトではファイルの作成日時を取得するために、Pythonのos.path.getctimeを確認していた。
これが間違っている。
システムの ctime、Unix系など一部のシステムでは最後にメタデータが変更された時刻、Windows などその他のシステムでは path の作成時刻を返します。返り値はエポック (time モジュールを参照) からの経過時間を示す秒数になります。ファイルが存在しない、あるいはアクセスできなかった場合は OSError を送出します。
ctimeはUNIX系のシステムのファイルシステムの情報であるが、ファイルの作成日時ではない。ファイルシステムのメタデータの変更日時である。
じゃあ、どうすればいいのか?
ファイルシステムのメタデータの変更日時ではなくて、macOSのFinderで表示されている情報が欲しい。 と言うわけで調べてみた。
どうやらmacOSのファイルシステムに拡張メタデータがあり、それを見れば良さそうだ。
Pythonで取得する方法を探す
上記のスタックオーバーフローでは、コマンドラインから取得している。 が、こう言うのはたいていライブラリがある。と思って探してみた。
あった。
さらにそこから、以下のライブラリを紹介されていた。
これが良さそうに見える。あとは、属性名が分かれば取得できそうだ。
必要な属性を探す
macOSの開発者ドキュメントを見ながら、ファイルのメタデータで、欲しいものを探す。
kMDItemContentCreationDate
がそれっぽい。
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
できた。
めでたしめでたし。