Windowsでは、ファイルやディレクトリのプロパティの日時関連の項目には
があり、実際にそれらの日時が表示される。
一方でGNU/Linuxにおいては、過去、OSの仕様としてファイルやディレクトリの作成日時はどこにも記録されず、調べることはできなかった。現在については後述。
また、ctime
と略される名前の属性はWindowsと同様に存在しているのだが、その意味はWindowsの “作成日時” とは異なり、“最後に内容または属性が変更された日時” となる。
属性 | 内容の変更をしたときに更新されるか | 属性の変更をしたときに更新されるか |
---|---|---|
mtime (Modify) | される | されない |
ctime (Change) | される | される |
mtime
は、touch
コマンドで任意に変更可能だが、ctime
は変更できない。
touch
コマンドをファイルに対して実行すると、実行したときの日時がctime
の新しい値として記録される。
また、cp
コマンドの-p
オプションを付けてコピーした場合、mtime
は保持される1が、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カーネルのバージョン4.112系から、OSの機能を呼び出す命令(システムコール)として既存のstat()
を拡張したstatx()
というものが追加され、作成日時を扱う仕組みが導入された。
glibcのバージョン2.28以上3およびcoreutilsのバージョン8.31以上4の条件を追加で満たしていれば、そのLinux OSは作成日時を扱える。
各ファイルシステムにおいては作成日時を格納するための属性で作成日時が記録される仕組みで、少なくともext4
やbtrfs
はこの情報を読み書きできる。この属性は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' [ファイルやディレクトリ...]
で作成日時のみを表示することもできる。
関連記事
参考URL