Linux

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

投稿日:

Linuxのファイルには3つの種類のタイプスタンプがあります。次の3つです。

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

この記事では、この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ノードのタイムスタンプはありません。

最終状態変更日時(mtime)とは

最終状態変更日時とは、iノードの情報が更新された日時です。ただしタイムスタンプ(これもiノード情報)の更新は含まれない。

「iノードの情報が更新された日時」ということがわかれば、どのような場合に更新されるかも分かるでしょう。そうです、chownでのファイル所有者の変更やchmodで権限を変更したときです。

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

最終アクセス日時とは、最後に「ファイルの内容」へアクセスした日時です。ファイル内容へのアクセスとは、つまりプログラムでファイル内容を読み込むことです。

具体的にはcatでファイルを表示、ページャー(moreやless)でファイルを表示、viエディタでファイルを読み込む(保存する必要ない)と最終アクセス日時が更新されます。

最終修正時刻(ctime)とは

最終修正日時とは、最後に「ファイルの内容」を修正した日時です。OSに近いレベルで言うと、write関数でファイルに書き込みを行なったような場合が該当します。つまりプログラムからファイルへ書き込みをした日時です。

したがって、viなどのエディタでファイル読み込んでも最終修正日時は更新されず、修正を保存するときに更新されます。

-Linux

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