質問: UNIX 系のシステムで典型的に使われるファイルシステムにおいて、ディレクトリのタイムスタンプが更新されるのは具体的にはどんなときなのでしょうか? POSIX (Base Specifications Issue 7, 2018 edition) の "4.9 File Times Update" には、ファイルの状態を操作するような関数はそれぞれ適切にタイムスタンプを更新すると書かれているのですが、実際どのような場合にタイムスタンプが更新されるのか気になりました。 > > Each function or utility in POSIX.1-2017 that reads or writes data (even if the data does not change) or performs an operation to change file status (even if the file status does not change) indicates which of the appropriate timestamps shall be marked for update. > > > たとえば、あるディレクトリ `D` 直下にあるテキストファイルが更新されたとき、`D` のタイムスタンプがどうなるかは決まっているのでしょうか? またもっと一般に、どんなことをするとディレクトリのタイムスタンプが更新され、どういうときには更新されないのでしょうか? ### 追記: コメントを受けて > > ファイルシステム (`fstype`) を限定しないと話が広がりすぎる可能性があります。 > > > ファイルシステムに詳しくないので、上手く限定できません......。回答時に必要であれば限定して頂ければと思います。私は Ubuntu を使っているので、たとえば Ubuntu でよく使われる ext4 に限定すると答えやすいのであれば、そうして頂いて構いません。
回答: `fstype` によって違うでしょう。とりあえず今 Linux 環境がないのでウチの hpux の `vxfs` で試してみました。ディレクトリの更新日付が変わるのは 「そのディレクトリ自体に書き込みがあったとき」すなわち - ファイルやディレクトリを作ったとき - ファイルやディレクトリを削除したとき - ファイル名の変更を行ったとき ``` $ mkdir hoge $ ls -ld --full-time hoge drwxrwxr-x 2 *** *** 96 2018-11-27 08:37:14.000000000 +0900 hoge/ $ touch hoge/hoge # 新規ファイルが作られるので $ ls -ld --full-time hoge # タイムスタンプが更新される drwxrwxr-x 2 *** *** 96 2018-11-27 08:37:37.000000000 +0900 hoge/ $ touch hoge/hoge # 既存ファイルのタイムスタンプが変わっても $ ls -ld --full-time hoge # タイムスタンプは更新されない drwxrwxr-x 2 *** *** 96 2018-11-27 08:37:37.000000000 +0900 hoge/ $ mkdir hoge/piyo # 新規ディレクトリが作られる $ ls -ld --full-time hoge # タイムスタンプが更新される drwxrwxr-x 2 *** *** 96 2018-11-27 08:37:55.000000000 +0900 hoge/ $ touch hoge/piyo/piyo # 別の(中であっても)ディレクトリを更新しても $ ls -ld --full-time hoge # タイムスタンプは更新されない drwxrwxr-x 2 *** *** 96 2018-11-27 08:37:55.000000000 +0900 hoge/ $ mv hoge/hoge hoge/fuga # ファイル名の変更を行うと $ ls -ld --full-time hoge # タイムスタンプは更新される drwxrwxr-x 2 *** *** 96 2018-11-27 08:38:45.000000000 +0900 hoge/ $ rm hoge/fuga # ファイルを削除すると $ ls -ld --full-time hoge # タイムスタンプは更新される drwxrwxr-x 2 *** *** 96 2018-11-27 08:38:59.000000000 +0900 hoge/ ``` ディレクトリは `inode` とファイル名の対応一覧を保持するファイルであると考えれば自然な挙動でしょう。 なお `cdfs` は原理的に readonly なので、タイムスタンプの更新はありません。 `fstype` ごとに違う可能性がある、この辺の体系だった解説一覧は `man` ページで見たことがないですし、各種ファイルシステムのソースコード見ないといけないかもしれません。 ファイルの中身を書き換えるだけだとディレクトリのタイムスタンプが変わらないことの試験結果も別途示したいところですが、うまくやらないと既存のファイル内容を捨てる際にファイル削除操作が入ったり、特にエディタを使うとバックアップファイルの作成を伴ったりするので評価が難しいです。オイラもう諦めて `touch` で済ませています。 最終アクセス時間 `atime` は `vxfs` では、ディレクトリに対しては無効なようです。まあもっとも `atime` は既定で無効にしていることのほうが多いようですが。