LinuC入門|touchコマンドでファイルのタイムスタンプを更新する

内容は変えず、時刻だけを更新する。touchコマンドでLinuxファイルの時間情報を正しく管理しよう。

Linuxのファイルには、名前、サイズ、所有者、アクセス権などの情報に加えて、いつアクセスされたのか、いつ内容が更新されたのかといった時間の情報が記録されています。この時間情報をタイムスタンプと呼びます。

ファイルの内容を書き換えると、通常は内容の更新日時も変化します。しかし、動作確認やファイル管理では、内容を変更せずにタイムスタンプだけを現在時刻へ更新したいことがあります。

そのときに使用するのがtouchコマンドです。

touchコマンドを使うと、既存ファイルのアクセス日時や更新日時を現在時刻へ変更できます。また、日時を指定して更新したり、アクセス日時と更新日時のどちらか一方だけを変更したりすることもできます。

さらに、指定したファイルが存在しない場合は、ファイルサイズが0バイトの空ファイルが新しく作成されます。そのため、touchはタイムスタンプの更新だけでなく、学習用や設定用の空ファイルを準備するときにもよく使われます。

この記事ではAlmaLinux 10.2を使用し、一般ユーザーsuzukiによる操作例を確認しながら、touchコマンドの書式、タイムスタンプの種類、-t、-a、-mの使い方、空ファイルが作成される仕組みを詳しく解説します。

ファイルに記録される3種類のタイムスタンプ

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

タイムスタンプ正式な名称表す内容
atimeアクセス日時ファイルの内容が最後に読み出された日時
mtime更新日時ファイルの内容が最後に変更された日時
ctimeステータス変更日時ファイルの管理情報が最後に変更された日時

3種類ともファイルに関係する日時ですが、それぞれが示す内容は異なります。

atimeとは

atimeはaccess timeの略で、ファイルの内容が最後にアクセスされた日時を表します。

たとえば、ファイルの内容を読み出す処理が行われると、atimeが更新されることがあります。

ただし、現在のLinuxでは、ファイルシステムのマウント設定によってatimeの更新回数が抑えられることがあります。そのため、ファイルを読み出すたびに必ずatimeが変化するとは限りません。

touchでは、-aを指定するとatimeだけを更新できます。

mtimeとは

mtimeはmodification timeの略で、ファイルの内容が最後に変更された日時を表します。

たとえば、テキストファイルへ新しい文章を書き込んだ場合や、既存の内容を修正した場合にmtimeが更新されます。

ls -lで通常表示される日時は、このmtimeです。

suzuki@AlmaLinux:~$ ls -l server-note.txt
-rw-r--r--. 1 suzuki suzuki 1845  8月 14 21:30 server-note.txt

この例では、server-note.txtの内容が最後に更新された日時が8月14日21時30分であることを示しています。

touchでは、-mを指定するとmtimeだけを更新できます。

ctimeとは

ctimeはchange timeの略で、ファイルのステータスが最後に変更された日時を表します。

ここでいうステータスとは、ファイルの内容だけではありません。次のような管理情報も含まれます。

  • アクセス権
  • 所有ユーザー
  • 所有グループ
  • ハードリンク数
  • ファイルサイズ
  • mtimeやatimeなどの時間情報

ctimeを作成日時と考えてしまうことがありますが、Linuxにおけるctimeは一般にcreation timeではありません。ファイルの管理情報が変化した日時です。

touchでatimeやmtimeを変更した場合も、時間情報という管理情報が変更されるため、ctimeは現在時刻へ更新されます。

touchでは、ctimeを利用者が指定した日時へ直接変更することはできません。

図1:atime・mtime・ctimeの違い

この図から分かること

atime、mtime、ctimeは、それぞれ異なる変化を記録しています。

ファイルを読み出した日時がatime、内容を変更した日時がmtime、ファイルの管理情報が変更された日時がctimeです。

ls -lで通常確認できるのはmtimeです。touchはatimeとmtimeを更新できますが、ctimeを任意の日時へ設定することはできません。

lsコマンドで更新日時を確認する

lsコマンドは、ファイルやディレクトリの情報を一覧表示するコマンドです。

今回の操作では、touchを実行する前後のmtimeを確認するために使用します。

lsコマンドの書式

ls [オプション] [ファイルまたはディレクトリ]

lsコマンドの主なオプション

オプション説明
-lファイルの種類、アクセス権、所有者、サイズ、mtimeなどを詳細表示する

ls -lの使用例

suzuki@AlmaLinux:~$ ls -l maintenance.log
-rw-r--r--. 1 suzuki suzuki 256  8月 14 20:15 maintenance.log

表示された各項目の意味は次のとおりです。

表示例説明
-rw-r--r--.ファイルの種類とアクセス権
1ハードリンク数
suzuki所有ユーザー
suzuki所有グループ
256ファイルサイズ
8月14日 20:15内容の更新日時であるmtime
maintenance.logファイル名

touchを実行した後にもう一度ls -lを実行し、日時が変化したか確認します。

touchコマンドとは

touchコマンドは、指定したファイルのatimeとmtimeを更新するコマンドです。

オプションを付けずに実行すると、atimeとmtimeの両方が現在時刻へ更新されます。既存ファイルの内容やサイズは変更されません。

指定した名前のファイルが存在しない場合は、サイズが0バイトの空ファイルが新しく作成されます。

touchコマンドの書式

touch [オプション] ファイル

touchコマンドの概要

項目内容
コマンドtouch
主な役割ファイルのatimeとmtimeを更新する
既定の日時コマンドを実行した現在時刻
ファイルが存在する場合内容を変えずにタイムスタンプを更新する
ファイルが存在しない場合サイズが0バイトの空ファイルを作成する

touchコマンドの主なオプション

オプション説明
-t [[CC]YY]MMDDhhmm[.ss]指定した日時を使用してタイムスタンプを更新する
-aatimeだけを更新する
-mmtimeだけを更新する

touchコマンドの引数

引数説明
ファイルタイムスタンプを更新するファイル名を指定する。存在しない場合は空ファイルが作成される

touchは複数のファイル名を並べて指定することもできますが、この記事では1つのファイルを対象に操作を確認します。

既存ファイルのタイムスタンプを現在時刻へ更新する

maintenance.logという既存ファイルを使って、touchの基本動作を確認してみましょう。

最初にls -lで現在のmtimeを確認します。

suzuki@AlmaLinux:~$ ls -l maintenance.log
-rw-r--r--. 1 suzuki suzuki 256  8月 14 20:15 maintenance.log

ファイルサイズは256バイト、mtimeは8月14日20時15分です。

次に、オプションを付けずにtouchを実行します。

suzuki@AlmaLinux:~$ touch maintenance.log

正常に更新できた場合、通常はメッセージを表示せずにプロンプトへ戻ります。

もう一度ls -lで確認します。

suzuki@AlmaLinux:~$ ls -l maintenance.log
-rw-r--r--. 1 suzuki suzuki 256  8月 15 00:25 maintenance.log

mtimeが8月15日0時25分へ変わりました。

一方、ファイルサイズは256バイトのままです。touchはmaintenance.logの内容を書き換えていないため、ファイルサイズも変化していません。

この操作で更新されるタイムスタンプを整理すると、次のようになります。

タイムスタンプtouch実行後の変化
atime現在時刻へ更新される
mtime現在時刻へ更新される
ctimeatimeとmtimeの変更に伴い、現在時刻へ更新される

ctimeも変化しますが、touchがctimeへ任意の日時を直接指定しているわけではありません。ファイルの管理情報が変更された結果として、自動的に現在時刻へ更新されます。

touchを実行してもファイル内容は変わらない

touchという名前から、ファイルの内容へ何かを書き込むように感じるかもしれません。しかし、既存ファイルにオプションなしでtouchを実行しても、内容は変更されません。

たとえば、maintenance.logに文字が保存されていても、touchの実行後にその文字が削除されたり追加されたりすることはありません。

変化するのは時間情報です。

項目touch実行前後
ファイル名変わらない
ファイル内容変わらない
ファイルサイズ変わらない
atime更新される
mtime更新される
ctime管理情報の変更に伴って更新される

タイムスタンプだけを調整したいときに、ファイル内容を開いて保存し直す必要はありません。

ファイルが存在しない場合は空ファイルが作成される

touchに存在しないファイル名を指定すると、エラーで終了するのではなく、その名前で空ファイルが作成されます。

この動作をempty-note.txtで確認してみましょう。

最初にcatコマンドでファイルの内容を表示しようとします。

suzuki@AlmaLinux:~$ cat empty-note.txt
cat: empty-note.txt: そのようなファイルやディレクトリはありません

この時点ではempty-note.txtが存在しないため、エラーが表示されます。

touchを実行します。

suzuki@AlmaLinux:~$ touch empty-note.txt

ls -lで確認します。

suzuki@AlmaLinux:~$ ls -l empty-note.txt
-rw-r--r--. 1 suzuki suzuki 0  8月 15 00:35 empty-note.txt

ファイルサイズが0と表示されています。これは、ファイルの中にデータが保存されていないことを表します。

catで内容を表示します。

suzuki@AlmaLinux:~$ cat empty-note.txt
suzuki@AlmaLinux:~$

内容が空なので何も表示されず、そのまま次のプロンプトへ戻ります。

図2:touchの対象が存在する場合と存在しない場合

この図から分かること

touchは、指定したファイルが存在するかどうかによって動作が変わります。

既存ファイルを指定した場合は、内容を変更せずにタイムスタンプを更新します。存在しないファイルを指定した場合は、その名前でサイズ0バイトの空ファイルを作成します。

空ファイルを作成するためだけの特別なオプションは必要ありません。

catコマンドとは

catコマンドは、指定したファイルの内容を端末へ表示するコマンドです。

catはconcatenateに由来する名前です。本来は複数のファイルを連結して表示する機能を持ちますが、1つのファイルの内容確認にもよく使われます。

この記事では、touchで作成したファイルの内容が空であることを確認するために使用します。

catコマンドの書式

cat [オプション] ファイル

catコマンドの主なオプション

今回の操作では、catにオプションを指定しません。

オプション説明
なし指定したファイルの内容を端末へ表示する

catコマンドの使用例

suzuki@AlmaLinux:~$ cat empty-note.txt

empty-note.txtが空の場合は、文字を何も表示せずにプロンプトへ戻ります。

catで何も表示されない場合でも、必ずしもファイルが存在しないわけではありません。

状態catの結果
ファイルが存在して内容があるファイル内容を表示する
ファイルが存在して内容が空何も表示せずプロンプトへ戻る
ファイルが存在しないそのようなファイルやディレクトリはありませんと表示する

-tで指定した日時へ変更する

-tを使用すると、現在時刻ではなく、指定した日時をタイムスタンプとして設定できます。

-tの書式

touch -t [[CC]YY]MMDDhhmm[.ss] ファイル

日時は区切り記号を入れず、決められた順番で数字を並べます。

[[CC]YY]MMDDhhmm[.ss]

各部分の意味は次のとおりです。

記号内容桁数指定例
CC西暦年の上2桁2桁20
YY西暦年の下2桁2桁26
MM2桁08
DD2桁15
hh2桁09
mm2桁30
ss2桁45

CCとYYは省略できます。西暦年を省略した場合は、現在の年が使用されます。

秒は.の後ろに指定し、省略できます。

西暦年を含めて日時を指定する

maintenance.logのatimeとmtimeを、2026年8月15日9時30分45秒へ変更してみましょう。

suzuki@AlmaLinux:~$ touch -t 202608150930.45 maintenance.log

指定値を分解すると次のようになります。

2026 08 15 09 30 .45
指定値意味
20262026年
088月
1515日
099時
3030分
4545秒

ls -lでmtimeを確認します。

suzuki@AlmaLinux:~$ ls -l maintenance.log
-rw-r--r--. 1 suzuki suzuki 256  8月 15 09:30 maintenance.log

ls -lの通常表示では、秒が省略されることがありますが、mtimeには指定した秒も記録されています。

西暦年と秒を省略して日時を指定する

現在の年の1月20日8時15分へ変更する場合は、次のように指定できます。

suzuki@AlmaLinux:~$ touch -t 01200815 maintenance.log

指定値は次のように分解できます。

01 20 08 15
指定値意味
011月
2020日
088時
1515分

西暦年と秒を省略しているため、実行時の年が使用され、秒は0として扱われます。

suzuki@AlmaLinux:~$ ls -l maintenance.log
-rw-r--r--. 1 suzuki suzuki 256  1月 20 08:15 maintenance.log

日時の各部分は必ず2桁で指定します。1月は1ではなく01、8時は8ではなく08と記述します。

-tで指定するときの注意点

-tの日時は、各部分の間に空白、ハイフン、スラッシュ、コロンを入れません。

正しい形式は次のように数字を続けます。

touch -t 202608150930.45 maintenance.log

-tでは次の点を確認してください。

  • 月は01から12で指定する
  • 日はその月に存在する日付を指定する
  • 時は00から23で指定する
  • 分は00から59で指定する
  • 秒を指定するときは.の後ろへ記述する
  • 年を省略すると現在の年が使用される
  • 既定ではatimeとmtimeの両方が指定日時へ変更される
  • ctimeは指定日時ではなく、操作を行った現在時刻へ更新される

-aでアクセス日時だけを更新する

-aを指定すると、atimeだけが更新されます。

-aの書式

touch -a ファイル

現在時刻をatimeとして設定する例は次のとおりです。

suzuki@AlmaLinux:~$ touch -a access-check.txt

この操作では、基本的に次のように変化します。

タイムスタンプ変化
atime現在時刻へ更新される
mtime変更されない
ctimeatimeの変更に伴って現在時刻へ更新される

ls -lで通常表示されるのはmtimeです。そのため、touch -aの前後でls -lを実行しても、表示される日時が変わらないことがあります。

suzuki@AlmaLinux:~$ ls -l access-check.txt
-rw-r--r--. 1 suzuki suzuki 120  8月 14 19:20 access-check.txt

suzuki@AlmaLinux:~$ touch -a access-check.txt

suzuki@AlmaLinux:~$ ls -l access-check.txt
-rw-r--r--. 1 suzuki suzuki 120  8月 14 19:20 access-check.txt

touch -aは正常に実行されていますが、mtimeを変更していないため、ls -lの日時表示は同じです。

-mで更新日時だけを更新する

-mを指定すると、mtimeだけが更新されます。

-mの書式

touch -m ファイル

使用例は次のとおりです。

suzuki@AlmaLinux:~$ ls -l report.txt
-rw-r--r--. 1 suzuki suzuki 980  8月 14 18:10 report.txt

suzuki@AlmaLinux:~$ touch -m report.txt

suzuki@AlmaLinux:~$ ls -l report.txt
-rw-r--r--. 1 suzuki suzuki 980  8月 15 00:50 report.txt

mtimeが8月15日0時50分へ更新されました。

この操作での変化は次のとおりです。

タイムスタンプ変化
atime変更されない
mtime現在時刻へ更新される
ctimemtimeの変更に伴って現在時刻へ更新される

ls -lではmtimeが表示されるため、touch -mの結果は直接確認しやすくなります。

-aまたは-mと-tを組み合わせる

-aや-mは、-tと組み合わせることができます。

atimeだけを2026年8月15日10時00分へ変更する場合は、次のように実行します。

suzuki@AlmaLinux:~$ touch -a -t 202608151000 access-check.txt

mtimeだけを2026年8月15日11時30分へ変更する場合は、次のように実行します。

suzuki@AlmaLinux:~$ touch -m -t 202608151130 report.txt

組み合わせによる違いは次のとおりです。

コマンドatimemtime
touch ファイル現在時刻へ更新現在時刻へ更新
touch -a ファイル現在時刻へ更新変更しない
touch -m ファイル変更しない現在時刻へ更新
touch -t 日時 ファイル指定日時へ更新指定日時へ更新
touch -a -t 日時 ファイル指定日時へ更新変更しない
touch -m -t 日時 ファイル変更しない指定日時へ更新

どの指定でも、atimeやmtimeが実際に変更されるとctimeは操作時の現在時刻へ更新されます。

図3:touchのオプションによる更新範囲

この図から分かること

オプションを付けないtouchはatimeとmtimeの両方を更新します。-aを付けるとatimeだけ、-mを付けるとmtimeだけが対象になります。

-tを組み合わせることで、現在時刻ではなく指定した日時を設定できます。一方、ctimeはどのオプションでも任意の日時へ直接設定できません。

touchを実行するために必要な権限

一般ユーザーsuzukiは、通常、自分が所有するファイルのタイムスタンプを変更できます。

suzuki@AlmaLinux:~$ touch server-note.txt

自分が所有していないファイルでは、アクセス権や指定方法によってtouchを実行できないことがあります。

現在時刻へ更新する場合は、対象ファイルに対する書き込み権限によって操作できる場合があります。一方、-tで任意の日時を指定する場合は、通常、対象ファイルを所有している必要があります。

権限がない場合は、次のようなエラーが表示されます。

suzuki@AlmaLinux:~$ touch protected.log
touch: 'protected.log' の時刻を設定中: 許可されていない操作です

学習では、suzukiのホームディレクトリにある自分のファイルを使用すると安全です。システムが使用している重要なファイルのタイムスタンプを、rootユーザーでむやみに変更しないようにしましょう。

touchを使用するときに確認したいポイント

touchを実行するときは、次の点を確認すると安全に操作できます。

  • 対象のファイル名が正しいか確認する
  • 既存ファイルか、新しく作成するファイルかを確認する
  • オプションなしではatimeとmtimeの両方が更新される
  • -aではatimeだけが更新される
  • -mではmtimeだけが更新される
  • -tでは数字の並び順を間違えない
  • 年を省略すると現在の年が使用される
  • 秒は.の後ろへ指定する
  • ls -lで通常表示されるのはmtimeである
  • touch -aの結果はls -lの日時には現れない
  • ctimeは任意の日時へ直接変更できない
  • 存在しないファイル名を指定すると空ファイルが作成される
  • 既存ファイルにtouchを実行しても内容とサイズは変わらない
  • 権限のないファイルはタイムスタンプを変更できない場合がある

touchは短いコマンドですが、タイムスタンプの種類とオプションの関係を理解していないと、意図しない日時を設定してしまうことがあります。

実行前にls -lでmtimeを確認し、touchを実行した後にもう一度ls -lで結果を確認する流れを身につけておくと、落ち着いて操作できるようになります。