ファイルの属性情報を探る 時刻編

ファイルの属性情報とは、そのファイルの内容以外に、そのファイルに関連付けられた情報すべてである。例えば、「hello」と書いて保存すると(ファイル名は「sample.txt」で保存)、「hello」以外の関連付けられたすべての情報は、属性情報である。

$ echo -n hello > sample.txt

f:id:zariganitosh:20130404103207p:image:h450]

  • アイコン
  • ファイル名「sample.txt」
  • コメント
  • 種類:標準テキスト書類
  • サイズ:5 バイト(ディスク上の 4 KB)
  • 場所
  • 作成日:今日 10:26
  • 変更日:今日 10:26
  • ラベル
  • ひな形の状態
  • ロックの状態
  • アクセス権限


以上、Finderの情報を見る(command-I)から確認しただけでも、少なくとも上記の情報は見える。たった5文字の「hello」にも、上記の情報が付加されるのだ。
さらに、属性情報はこれだけではない。Finderからは見えない、さらに多くの情報が付加されている。OSXはこの属性情報を基盤に、快適なサービスを運営している。いったい、どれだけの属性情報が付加されているのか?正直、正確には把握できていない...。この際、調べられる限りの属性情報を調べてみようと思う。

日時情報

日時情報 更新される条件
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などのコマンド環境だけのソフトウェアでは更新されなかった。
追加日(現在のファイルパスになった日時を記録する) ・ファイルの移動、ファイルの名称変更によって更新された。
  • これらの日時情報はファイルシステムHFS+の属性情報なのか、Finderが管理する属性情報なのか、判断できなかった...。
    • ソースコードのヘッダーの中には、それらしき記述が見つからなかったのだ。
  • ところで、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"
)

f:id:zariganitosh:20130404163052p:image:w450]

  • どうやら、FinderがSpotlightのインデックス情報を見て、取得しているようだ。
    • kMDItemDateAdded06:57:13 = 追加日15:57
    • kMDItemLastUsedDate07:01:18 = 最後に開いた日16:01
  • 時刻は9時間ズレているが、それはタイムゾーンの扱いが違うためだと思われる。

Finderの追加日最後に開いた日は、Spotlightのインデックス情報なのであった。(たぶん)

まとめ

  • FinderもGUI環境のOSと考えるならば、OSX環境では全部で7つの日時情報が活用されていたのだ。
管理 日時情報 更新される条件 修正
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