Linuxのctimeは、内容か属性が修正された日時を指し、作成日時を指すのではない

Last modified: 2021-10-01

Linuxにおけるctimeとは

Windowsでは、ファイルやディレクトリのプロパティの日時関連の項目には

  • 作成日時
  • 更新日時
  • アクセス日時

があり、実際にそれらの日時が表示される。

一方でGNU/Linuxにおいては、過去、OSの仕様としてファイルやディレクトリの作成日時はどこにも記録されず、調べることはできなかった。現在については後述。

また、ctimeと略される名前の属性はWindowsと同様に存在しているのだが、その意味はWindowsの “作成日時” とは異なり、“最後に内容または属性が変更された日時” となる。

mtimeとctimeの違い

属性 内容の変更をしたときに更新されるか 属性の変更をしたときに更新されるか
mtime (Modify) される されない
ctime (Change) される される

mtimeは、touchコマンドで任意に変更可能だが、ctimeは変更できない。

touchコマンドをファイルに対して実行すると、実行したときの日時がctimeの新しい値として記録される。

また、cpコマンドの-pオプションを付けてコピーした場合、mtimeは保持される1が、ctimeはコピーを実行したときの日時となる。

属性の変更によりctimeが変更されることを確認する

以下の一連の作業を行うことで、属性の変更でctimeが変更されることが確認できる。

(新規に空のファイルを作成)
$ touch me

(作成したファイルの属性を書き出す)
$ stat me > before.txt

(そのファイルの属性を変更してみる)
$ chmod go-r me

(属性を変更した後でファイルの属性を別ファイルに書き出す)
$ stat me > after.txt

(変更前後の属性情報を比較)
$ diff -u before.txt after.txt

(後始末)
$ rm me before.txt after.txt -f

diffを実行したときの結果の例は以下。

--- before.txt  2007-08-29 20:17:20.021030525 +0900
+++ after.txt   2007-08-29 20:17:28.912674049 +0900
@@ -1,7 +1,7 @@
   File: `me'
   Size: 0              Blocks: 0          IO Block: 4096   通常の空ファイル
 Device: 12h/18d        Inode: 328398      Links: 1
-Access: (0644/-rw-r--r--)  Uid: ( [ユーザID]/     [ユーザ名])   Gid: (  [グループID]/   [グループ名])
+Access: (0600/-rw-------)  Uid: ( [ユーザID]/     [ユーザ名])   Gid: (  [グループID]/   [グループ名])
 Access: 2007-08-29 20:17:15.775678181 +0900
 Modify: 2007-08-29 20:17:15.775678181 +0900
-Change: 2007-08-29 20:17:15.775678181 +0900
+Change: 2007-08-29 20:17:24.969275640 +0900

アクセス権以外では “Modify” が変更されずに “Change” だけが変更されていることが分かる。

追記:Linuxで作成日時を扱う仕組み(statx()システムコールとファイルシステム属性)

Linuxカーネルのバージョン4.112系から、OSの機能を呼び出す命令(システムコール)として既存のstat()を拡張したstatx()というものが追加され、作成日時を扱う仕組みが導入された。

glibcのバージョン2.28以上3およびcoreutilsのバージョン8.31以上4の条件を追加で満たしていれば、そのLinux OSは作成日時を扱える。

各ファイルシステムにおいては作成日時を格納するための属性で作成日時が記録される仕組みで、少なくともext4btrfsはこの情報を読み書きできる。この属性はcrtimeまたはbtimeと呼ばれる。

作成日時の属性がサポートされているシステム5においてはstatコマンドの出力に “Birth” という項目があり、ファイルシステムに記録された作成日時(情報がなければ-)をstatコマンドで表示できる。

(手元のファイルでの例)
$ stat /var/log/dpkg.log
  File: /var/log/dpkg.log
  ...
 Birth: 2021-09-01 00:00:34.547643566 +0900

stat -c '%w' [ファイルやディレクトリ...]で作成日時のみを表示することもできる。


  1. アクセス日時も保持されるが、ファイルシステムのマウント設定にnoatimeがない場合、コピー元のファイルのアクセス日時が更新される ↩︎

  2. 2017年4月末に公開 ↩︎

  3. 2018年8月に公開 ↩︎

  4. 2019年3月に公開 ↩︎

  5. 2020年前後に公開されたディストリであれば対応済みと考えられる ↩︎