Linuxのファイルタイムスタンプ徹底解説:mtime・ctime・atimeの違いと使い方
Linux OSは、システム上の各ファイルについて3種類のタイムスタンプを記録しています。これらを確認すれば、ファイルが最後にいつ更新されたのかを知ることができます。しかし、それぞれのタイムスタンプにはどんな意味があるのでしょうか?また、ファイルごとにこれらの時刻を調べるにはどうすればよいのでしょうか?ディレクトリの場合は何か違いがあるのでしょうか?
atime、ctime、mtimeという3つのタイムスタンプを理解すれば、こうした疑問はすべて解決します。これらはUnixファイルシステムが記録している日時情報です。何がいつ変更されたのかを把握したい場面で必ず役立つので、ぜひ最後まで読んでみてください。
3つのUnixタイムスタンプとは?
すべてのファイルには3つのタイムスタンプが関連付けられています。Linuxはこれらを、エポック(1970年1月1日0時0分0秒UTC)からの経過秒数で表すUnix時間形式で保存します。3つのタイムスタンプは一般にatime、ctime、mtimeと呼ばれます。
mtime(modification time/修正時刻)は最も一般的で、多くの場面で最も有用なタイムスタンプです。ファイルの内容が最後にディスクへ書き込まれた時刻を示します。
少し性質が異なるのがctime(change time/変更時刻)です。このタイムスタンプは、所有権やパーミッションといったメタデータの変更を記録します。少なくとも一般的な最近のLinux OSでは、ファイル名の変更も含まれます。ただし、ファイルの内容が変わったときにも更新されるため、常にmtime以上に新しい状態になっています。
3番目のタイムスタンプはatime(access time/アクセス時刻)で、そのファイルに最後にアクセスがあった時刻を記録します。
ディレクトリにおけるタイムスタンプの扱い
Linuxのディレクトリは、実質的にはその中に含まれるファイルの一覧です。したがって、ディレクトリ内にファイルを作成すると、そのディレクトリのmtimeが更新されます。lsコマンドなどでディレクトリ内のファイル一覧を表示すると、アクセス時刻(atime)が更新されます。また、ファイルの場合と同様に、ディレクトリのパーミッションや名前を変更すると、ctimeが更新されます。
作成時刻(creation time)は記録されない
意外に思われるかもしれませんが、Linuxはそもそもファイルの作成時刻を記録していません。「ctime」は「creation time(作成時刻)」の略だと勘違いしやすく、作成時刻がわかれば便利だろうと考えるのも自然なことです。
しかしそれが意図的に省かれているのには理由があります。多くのアプリケーションは、保存のたびにファイルを新規に作成し直すため、作成時刻を参照すると誤った情報になってしまうのです。
各タイムスタンプの確認方法
タイムスタンプ情報を取得する最も簡単な方法はlsコマンドです。デフォルトの長い形式では、mtimeの詳細が表示されます。
$ date
Sat Mar 6 16:57:01 GMT 2021
$ echo "hello, world" > tmp
$ ls -l tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp
-uオプションを使うと、代わりにatimeを表示できます。
$ date
Sat Mar 6 16:59:33 GMT 2021
$ cat tmp
hello, world
$ ls -lu tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:59 tmp
$ ls -l tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp
最後の行から、このファイルのmtimeとatimeが異なることが確認できます。続いて、-cオプションでctimeを表示してみましょう。
$ date
Sat Mar 6 17:02:34 GMT 2021
$ mv tmp tmp2
$ ls -lc tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 17:02 tmp2
$ ls -l tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp2
$ ls -lu tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:59 tmp2
今回は、3つの時刻がそれぞれ異なり、しかも正しい順序であることを確認できました。つまり、ファイルに対して「修正→アクセス→変更」の順に操作を行った通りの結果になっています。
lsの代わりとなるのがstatコマンドです。このコマンドは、ファイルのinodeから低レベルの詳細情報を表示します。3つの時刻を一度に確認できるため非常に便利で、直感的でない-uオプションの問題も回避できます。同じファイルに対する出力例は以下の通りです。
$ stat tmp2
File: `tmp2'
Size: 13 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 327688 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ ubuntu) Gid: ( 1000/ ubuntu)
Access: 2021-03-06 16:59:45.000000000 +0000
Modify: 2021-03-06 16:57:59.000000000 +0000
Change: 2021-03-06 17:02:43.000000000 +0000
タイムスタンプの更新方法
touchコマンドは、ファイルの修正時刻とアクセス時刻を変更します。また、指定したファイルが存在しない場合は空のファイルを新規作成してくれるため、空ファイル作成の定番手段としても知られています。
touch tmp
デフォルトでは、mtimeとatimeが現在時刻に設定されます。-tオプションを使えば、任意の時刻を指定することも可能です。
touch -t 202103061200 tmp
さらに、-mオプションや-aオプションを使うと、mtimeまたはatimeだけを個別に設定できます。
touch -t 202103061300 -m tmp
なお、atimeやmtimeを設定すると、ctimeは必ずあわせて更新される点に注意してください。
タイムスタンプをもとにファイルを検索する
findコマンドも、タイムスタンプを活用できる強力なツールです。atime、ctime、mtimeに基づいてファイルを絞り込むことができます。例えば次のコマンドは、
find . -amin 15
ちょうど15分前にアクセスされたファイルを検索します。一方、
find . -mtime -2
こちらは、過去2日以内に修正されたファイルを検索します。
まとめ:Linuxはすべてのファイルを3重に管理している
最もよく参照されるファイルのタイムスタンプはmtimeです。たとえば、ファイル一覧に表示される日時はこのmtimeです。しかし、それぞれの意味をきちんと理解していれば、残りの2つのタイムスタンプも大いに役立ちます。特に忘れてならないのは、ctimeが表すのは「change(変更)時刻」であって、「creation(作成)時刻」ではないという点です。
touchやstatといったコマンドは、Linuxコマンドラインツールボックスの中でも有用な存在です。これらを使いこなせるようになれば、新しいファイルを素早く作成できるなど、日常的な作業効率が大きく向上するでしょう。
-
Linuxのシェル初期化ファイルとユーザープロファイルを徹底解説
Linuxはマルチユーザー・タイムシェアリング方式のOSであり、複数のユーザーが同時に1台のシステムへログインして利用できます。そのため、システム管理者は、ソフトウェアのインストール・更新・削除、ユーザーが実行できるプログラム、閲覧・編集できるファイルなど、ユーザーごとの操作範囲を管理する役割を担っています。 Linuxでは、ユーザー環境の構築や維持を「システム全体(グローバル)」と「ユーザー固有(個人)」という2つの方法で行えます。通常、Linuxシステムを操作する基本手段はシェルであり、シェルはユーザーのログイン成功後に初期化処理として特定のファイルを読み込み、それに基づいて環境を構築しま
-
chmod 777とは?Linuxにおける意味と正しい使い方を徹底解説
この記事では、ユーザー(所有者)、グループ、その他のユーザーのすべてに全権限を付与するLinuxコマンド「chmod 777」について詳しく解説します。 Linux初心者の方、Web開発者、システム管理者であれば、次のようなコマンドを入力するよう指示された経験があるかもしれません。 chmod 777 /path/to/file/or/folder システム上でコマンドを実行するとき(特にrootユーザーとして作業する場合は!)には、そのコマンドが何を行うのかを必ず理解しておくべきです。では、「chmod 777」とは一体何なのでしょうか? Linuxにおけるパーミッションの基本 まずは、以下