Linux

最終アクセス時刻(atime)、最終修正時刻(mtime)、最終状態変更時刻(ctime)とは

更新日:

Linuxのファイルには3つの種類のタイプスタンプがあります。次の3つです。
  • 最終アクセス時刻(atime)
  • 最終修正時刻(mtime)
  • 最終状態変更時刻(ctime)
この記事では、この3つのタイムスタンプの詳細を説明します。最初にタイムスタンプの概要を一覧し、次にタイムスタンプの確認方法、最後にそれぞれのタイムスタンプの詳細を確認します。

タイムスタンプの概要

3つのタイムスタンプの概要を以下に示します。詳しい内容は後で説明します。
タイムスタンプの種類 説明
最終アクセス日時 (atime) 最後にファイルにアクセスした日時。catやページャでファイルを読んだ時に更新される。
最終修正日時 (mtime) 最後にファイルの内容を修正した日時。ファイルへ書き込みを行なったときに更新される。
最終状態変更日時 (ctime) 最後にファイルのiノードの情報を更新した日時。ファイルの権限や所有者などのiノード情報の修正時に更新される。
atime、mtime、ctimeという用語はシステムコールのstat関数に由来します(すると思う。詳しく調べてません)。この関数では最終アクセス時刻、最終修正時刻、最終状態変更時刻はそれぞれst_atime、st_mtime、st_ctimeで参照できます。

タイムスタンプの確認方法

タイムスタンプを確認するにはstatコマンドが簡単です。statコマンドはiノードの情報を表示します。
# stat foo
...
Access: 2021-07-04 00:44:36.181883562 +0900
Modify: 2021-07-04 00:44:36.181883562 +0900
Change: 2021-07-04 00:44:36.181883562 +0900
...
Access→最終アクセス時刻、Modify→最終修正時刻、Change→最終状態変更時刻です。 lsコマンドを使って確認することもできます。複数ファイルを確認する場合は、lsコマンドが便利です。
# ls -l foo
-rw-r--r-- 1 root root 0 Jul  4 00:44 foo
# ls -lu foo
-rw-r--r-- 1 root root 0 Jul  4 00:44 foo
# ls -lc foo
-rw-r--r-- 1 root root 0 Jul  4 00:44 foo
「-l」で表示されるのは最終修正時刻です。「-lu」で最終アクセス時刻、「-lc」で最終状態変更時刻を表示します。

最終アクセス時刻・最終修正時刻・最終状態変更時刻の詳細

3つのタイムスタンプを正しく理解するためには、iノードについて知っている必要があります。重要な点はファイルの属性はiノードに、ファイルの内容は別の領域(データブロック)に保存されているということです。 3つのタイムスタンプの詳細を説明する前に、iノードについて少し確認しましょう。

iノードとは

システムのファイルシステムを作成すると、iノードのための領域も同時に作成されます(この領域はパーティションごとに存在)。この領域は後から増やすことはできず、またiノードは固定長なので、iノードの個数もファイルシステム作成時に決まります。 1つのファイルが作成されると1つのiノードが割り当てられます。iノードにはファイルに関するほとんどの情報が格納されます。以下はiノードに収められているファイルの属性の一部です。
  • ファイルの種類
  • アクセス権限
  • ファイルサイズ
  • ファイルのデータブロックへのポインタ
  • ファオルの所有者のユーザーID、グループ所有者のグループID
  • 最終アクセス時刻
  • 最終修正時刻
  • 最終状態変更時刻
3つのタイムスタンプもiノードに収められています。ファイルの内容は、iノードとは別の領域(データブロック)に保存されます。つまりiノードとファイルの内容は別々の場所にあります。iノードにはファイルの内容の場所を示すポインタがあるだけです。 最終アクセス時刻と最終修正時刻は「ファイルの内容」に関するタイムスタンプです。最終状態変更時刻は「iノード」に関するタイムスタンプです。ファイルの内容とiノードは別々に存在するため、タイムスタンプも別々にあります。 ファイル内容の更新時刻である最終修正時刻は、iノードでは最終状態変更時刻が対応します。iノードへのアクセスは管理されていないので、最終アクセス時刻に対応するiノードのタイムスタンプはありません。

最終状態変更時刻(ctime)とは

最終状態変更時刻とは、iノードの情報が更新された時刻です。ただしタイムスタンプ(これもiノード情報)の更新は含まれない。 「iノードの情報が更新された時刻」ということがわかれば、どのような場合に更新されるかも分かるでしょう。そうです、chownでのファイル所有者の変更やchmodで権限を変更したときです。

最終アクセス時刻(atime)とは

最終アクセス時刻とは、最後に「ファイルの内容」へアクセスした時刻です。ファイル内容へのアクセスとは、つまりプログラムでファイル内容を読み込むことです。 具体的にはcatでファイルを表示、ページャー(moreやless)でファイルを表示、viエディタでファイルを読み込む(保存する必要ない)と最終アクセス時刻が更新されます。

最終修正時刻(mtime)とは

最終修正時刻とは、最後に「ファイルの内容」を修正した時刻です。OSに近いレベルで言うと、write関数でファイルに書き込みを行なったような場合が該当します。つまりプログラムからファイルへ書き込みをした時刻です。 したがって、viなどのエディタでファイル読み込んでも最終修正時刻は更新されず、修正を保存するときに更新されます。

-Linux

Copyright© アナグマのモノローグ , 2024 All Rights Reserved Powered by STINGER.