- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-ディレクトリのタイムスタンプ
!!環境
*使用OS:Linux RHEL3
!!現象
*ディレクトリのタイムスタンプはどんな時に更新されるのか?
!!検証結果
結論:ディレクトリのタイムスタンプは、直下のファイル/ディレクトリの追加・削除があったときに更新される。
実証:
(1) ディレクトリを作り、その下にファイルを作成・削除
$ date
Mon May 1 17:23:01 JST 2006
$ ls
<何も無い>
$ mkdir abc
$ ls -l
drwxr-xr-x 2 hoge fuga 4096 May 1 17:23 abc ←ディレクトリができた
$ cd abc
$ date
Mon May 1 17:25:01 JST 2006
$ touch aaa ←新しいディレクトリ下にファイルを作成
$ ls -l
-rw-r--r-- 1 hoge fuga 0 May 1 17:25 aaa
$ cd .. ←親ディレクトリに戻る
$ ls -l
drwxr-xr-x 2 hoge fuga 4096 May 1 17:25 abc
↑親ディレクトリのタイムスタンプが変わっている
$ date
Mon May 1 17:26:01 JST 2006
$ rm abc/aaa
$ ls -l
drwxr-xr-x 2 hoge fuga 4096 May 1 17:26 abc
↑親ディレクトリのタイムスタンプが変わっている
(2)ディレクトリ下のファイルを更新する
$ date
Mon May 1 17:27:28 JST 2006
$ touch abc/aaa ←ファイルのタイムスタンプを変える
$ ls -l abc/aaa
-rw-r--r-- 1 hoge fuga 0 May 1 17:27 abc/aaa
$ ls -l
drwxr-xr-x 2 hoge fuga 4096 May 1 17:25 abc
↑でも、親ディレクトリのタイムスタンプは変わらない
(3)ディレクトリ下に更にディレクトリを作る
$ date
Mon May 1 17:34:28 JST 2006
$ mkdir abc/def ←ディレクトリ下にディレクトリを作る
$ ls -l abc/ ←新しいディレクトリのタイムスタンプを調べる
drwxr-xr-x 2 hoge fuga 4096 May 1 17:34 def
$ ls -l ←親ディレクトリのタイムスタンプを調べる
drwxr-xr-x 3 hoge fuga 4096 May 1 17:34 abc
↑変わっている
(4)ディレクトリの下にディレクトリを作り、そこにファイルを作る
$ date
Mon May 1 17:35:56 JST 2006
$ touch abc/def/xyz
$ ls -l abc/def/xyz ←新しいファイルのタイムスタンプ
-rw-r--r-- 1 hoge fuga 0 May 1 17:36 abc/def/xyz
$ ls -l abc/ ←子ディレクトリのタイムスタンプ
drwxr-xr-x 2 hoge fuga 4096 May 1 17:36 def
↑変わっている
$ ls -l . ←親ディレクトリのタイムスタンプ
drwxr-xr-x 3 hoge fuga 4096 May 1 17:34 abc
↑変わっていない
!!推測
ディレクトリとは、「ディレクトリ内のファイルインデックスを持つファイル」と解釈できる。
ディレクトリの直下の構成要素を追加・削除した場合はインデックスの内容が変化するのでディレクトリのタイムスタンプは変わる。
しかし、一度作成されたファイルの変更は、そのファイル自身のタイムスタンプは変化するが、それのあるディレクトリのインデックスには何ら影響しないのでディレクトリのタイムスタンプは変化しない。
もっと踏み込んで言えば、タイムスタンプはiノードそのものに付随するステータスである。
iノードはディレクトリでもファイルでもそれぞれ固有のものを持っている。
ただ、このあたりの仕組みが、ファイルシステムの種類、OSの種類などに依存するのか不明な為、必要であるなら検証してみたほうが無難だと思われる。
(個人的な推測では「iノード」というものがOSのVFS(バーチャルファイルシステム)の構造体に含まれるものの為、少なくとも同じOSであれば同様の動作をするのではないかと思われる。)
!!履歴
2006/5/1 -- 初版
[[技術的雑談]]へ戻る
!!突っ込み
{{comment}}
[[技術的雑談]]へ戻る
{{trackback}}
[[技術的雑談]]へ戻る