ファイルの属性情報を探る 時刻編
ファイルの属性情報とは、そのファイルの内容以外に、そのファイルに関連付けられた情報すべてである。例えば、「hello」と書いて保存すると(ファイル名は「sample.txt」で保存)、「hello」以外の関連付けられたすべての情報は、属性情報である。
$ echo -n hello > sample.txt
- アイコン
- ファイル名「sample.txt」
- コメント
- 種類:標準テキスト書類
- サイズ:5 バイト(ディスク上の 4 KB)
- 場所
- 作成日:今日 10:26
- 変更日:今日 10:26
- ラベル
- ひな形の状態
- ロックの状態
- アクセス権限
以上、Finderの情報を見る(command-I)から確認しただけでも、少なくとも上記の情報は見える。たった5文字の「hello」にも、上記の情報が付加されるのだ。
さらに、属性情報はこれだけではない。Finderからは見えない、さらに多くの情報が付加されている。OSXはこの属性情報を基盤に、快適なサービスを運営している。いったい、どれだけの属性情報が付加されているのか?正直、正確には把握できていない...。この際、調べられる限りの属性情報を調べてみようと思う。
日時情報
- 伝統的なUNIXの日時情報には、そもそも3つの日時情報しかなかった。
- 参考:UNIXの部屋 コマンド検索:タイムスタンプ (*BSD/Linux)(感謝です!)
日時情報 | 更新される条件 |
---|---|
mtime(modify time=最終変更日時を記録する) | ・ファイルの内容を変更した場合に更新される。 |
ctime(change time=最終ステータス変更日時を記録する) | ・ファイルの内容を変更した場合に更新される。 ・ファイルの属性情報を変更した場合に更新される。 |
atime(access time=最終アクセス日時を記録する) | ・ファイルの内容を変更した場合に更新される。 ・ファイルの属性情報を変更した場合に更新される。 ・catやFinderで表示した場合に更新される。lsでは変更なし。 |
-
-
- 更新される条件は、OSX 10.8.3環境で調べた。
-
- ちなみに、mtimeはtouchコマンドで好みに修正できるが、atimeとctimeは修正できなかった。
- 意外なことに、伝統的なUNIXの日時情報には「作成日時」が存在しない。
- しかし、OSXの標準ファイルシステムであるHFS+では、「作成日時」もちゃんと記録される。
/* HFS Plus catalog file record - 248 bytes */ struct HFSPlusCatalogFile { int16_t recordType; /* == kHFSPlusFileRecord */ u_int16_t flags; /* file flags */ u_int32_t reserved1; /* reserved - initialized as zero */ u_int32_t fileID; /* file ID */ u_int32_t createDate; /* date and time of creation .......................[1] */ u_int32_t contentModDate; /* date and time of last content modification ......[2] */ u_int32_t attributeModDate; /* date and time of last attribute modification ....[3] */ u_int32_t accessDate; /* date and time of last access (MacOS X only) .....[4] */ u_int32_t backupDate; /* date and time of last backup ....................[5] */ HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */ FndrFileInfo userInfo; /* Finder information */ FndrOpaqueInfo finderInfo; /* additional Finder information */ u_int32_t textEncoding; /* hint for name conversions */ u_int32_t reserved2; /* reserved - initialized as zero */ /* Note: these start on double long (64 bit) boundary */ HFSPlusForkData dataFork; /* size and block data for data fork */ HFSPlusForkData resourceFork; /* size and block data for resource fork */ } __attribute__((aligned(2), packed));
- おそらく...
- [1]=作成日時
- [2]=mtime=変更日時
- [3]=ctime=ステータス変更日時
- [4]=atime=アクセス日時
- [5]=バックアップ日時
- バックアップ日時まである。きっとTimeMachineがバックアップするか、しないかの判定に使うのだと思う。
- また、Finderの項目しか確認できなかったが、表示オプション(command-J)で確認できる日時情報として、さらに2つある。
日時情報 | 更新される条件 |
---|---|
最後に開いた日(Finder環境で開いた日時を記録する) | ・Finder環境を利用するソフトウェアで開くと更新された。 ・cat viなどのコマンド環境だけのソフトウェアでは更新されなかった。 |
追加日(現在のファイルパスになった日時を記録する) | ・ファイルの移動、ファイルの名称変更によって更新された。 |
- ところで、Spotlightが管理するインデックス情報を確認するmdlsというコマンドがある。それを実行してみると...
$ mdls sample.txt kMDItemContentCreationDate = 1998-01-01 03:34:56 +0000 kMDItemContentModificationDate = 1998-01-01 03:34:56 +0000 kMDItemContentType = "public.plain-text" kMDItemContentTypeTree = ( "public.plain-text", "public.text", "public.data", "public.item", "public.content" ) kMDItemDateAdded = 2013-04-04 06:57:13 +0000 kMDItemDisplayName = "sample.txt" kMDItemFSContentChangeDate = 1998-01-01 03:34:56 +0000 kMDItemFSCreationDate = 1998-01-01 03:34:56 +0000 kMDItemFSCreatorCode = "" kMDItemFSFinderFlags = 0 kMDItemFSHasCustomIcon = 0 kMDItemFSInvisible = 0 kMDItemFSIsExtensionHidden = 0 kMDItemFSIsStationery = 0 kMDItemFSLabel = 0 kMDItemFSName = "sample.txt" kMDItemFSNodeCount = 1348 kMDItemFSOwnerGroupID = 20 kMDItemFSOwnerUserID = 501 kMDItemFSSize = 1348 kMDItemFSTypeCode = "" kMDItemKind = "Text Document" kMDItemLastUsedDate = 2013-04-04 07:01:18 +0000 kMDItemLogicalSize = 1348 kMDItemPhysicalSize = 8192 kMDItemUseCount = 9 kMDItemUsedDates = ( "2013-04-03 15:00:00 +0000" )
- どうやら、FinderがSpotlightのインデックス情報を見て、取得しているようだ。
- kMDItemDateAdded06:57:13 = 追加日15:57
- kMDItemLastUsedDate07:01:18 = 最後に開いた日16:01
- 時刻は9時間ズレているが、それはタイムゾーンの扱いが違うためだと思われる。
Finderの追加日と最後に開いた日は、Spotlightのインデックス情報なのであった。(たぶん)
まとめ
管理 | 日時情報 | 更新される条件 | 修正 |
---|---|---|---|
HFS+ | 作成日時 | ・ファイルを新規作成した時に更新される。 | 修正可能。 setfile -d '01/01/1999 12:43:56' sample.txt |
HFS+ | mtime(modify time=変更日時) | ・ファイルの内容を変更した場合に更新される。 | 修正可能。 touch -mt 200101011234.56 sample.txt |
HFS+ | ctime(change time=ステータス変更日時) | ・ファイルの内容を変更した場合に更新される。 ・ファイルの属性情報を変更した場合に更新される。 |
修正できない。 |
HFS+ | atime(access time=アクセス日時) | ・ファイルの内容を変更した場合に更新される。 ・ファイルの属性情報を変更した場合に更新される。 ・catやFinderで表示した場合に更新される。lsでは変更なし。 |
修正できない。 |
HFS+ | バックアップ日時 | ・(予想)TimeMachineでバックアップされた時に更新される。 | 修正できない。 |
Spotlight | 最後に開いた日(Finder環境で開いた日時を記録する) | ・Finder環境を利用するソフトウェアで開くと更新された。 ・cat viなどのコマンド環境だけのソフトウェアでは更新されなかった。 |
修正できない。 |
Spotlight | 追加日(現在のファイルパスになった日時を記録する) | ・ファイルの移動、ファイルの名称変更によって更新された。 | 修正できない。 |
日時情報に関連するコマンド
- 上記の日時情報の確認をする時に使ったコマンド一覧。
# 更新日時mtimeを表示する $ ls -l sample.txt -rw-r--r--@ 1 bebe staff 10 4 4 16:59 sample.txt # 更新日時mtimeを表示する(秒と年も表示) $ ls -lT sample.txt -rw-r--r--@ 1 bebe staff 10 4 4 16:59:31 2013 sample.txt # アクセス日時atimeを表示する(秒と年も表示) $ ls -luT sample.txt -rw-r--r--@ 1 bebe staff 10 4 4 16:59:33 2013 sample.txt # 作成日時を表示する(秒と年も表示) $ ls -lUT sample.txt -rw-r--r--@ 1 bebe staff 10 1 1 12:34:56 1998 sample.txt # ステータス変更日時ctimeを表示する(秒と年も表示) $ ls -lcT sample.txt -rw-r--r--@ 1 bebe staff 10 4 4 16:59:31 2013 sample.txt
# ファイルの属性をまとめて表示する $ stat sample.txt 16777218 8010624 -rw-r--r-- 1 bebe staff 0 10 "Apr 4 17:05:33 2013" "Apr 4 17:05:25 2013" "Apr 4 17:05:25 2013" "Jan 1 12:34:56 1998" 4096 16 0 sample.txt # ファイルの属性をまとめて表示する(項目名あり) $ stat -s sample.txt st_dev=16777218 st_ino=8010624 st_mode=0100644 st_nlink=1 st_uid=501 st_gid=20 st_rdev=0 st_size=10 st_atime=1365062733 st_mtime=1365062725 st_ctime=1365062725 st_birthtime=883625696 st_blksize=4096 st_blocks=16 st_flags=0
# ファイルの変更日時mtimeを任意の日時に修正する $ touch -mt 199901011234.56 sample.txt
# ファイルの作成日時を任意の日時に修正する $ setfile -d '01/01/1999 12:43:56' sample.txt # ファイルの変更日時mtimeを任意の日時に修正する $ setfile -m '01/01/1999 12:43:56' sample.txt
# ファイルの属性情報を表示する $ GetFileInfo sample.txt file: "/Users/bebe/Desktop/sample.txt" type: "\0\0\0\0" creator: "\0\0\0\0" attributes: avbstclinmedz created: 01/01/1999 12:43:56 modified: 04/04/2013 17:05:25
# Spotlightのインデックス情報を表示する
$ mdls sample.txt