こんにちは、AWSが面白いので基礎となるLinuxを学び直しているねこだくさんです。
今回はファイルを作成するときになんとなく使っているtouchコマンドについて学びます。
コマンド操作についてはいつもの通りEnvaderで実行しています。
猫たちはいつもの通りそのへんで転がっています。

touchコマンドとは
ファイルを作成するコマンドとして使用してきましたが、本来はファイルのタイムスタンプを変更するためのコマンドです。
タイムスタンプとは?
ファイルの最終更新日のことです。
タイムスタンプ変更
touchコマンドの役割というのは理解しましたが、どのようなときに使用するのでしょうか?
結論から言うと有用な用途を説明しているサイトは見つけることができませんでした。
ファイルの最終更新日を改ざんするためのものとの説明もありましたが、それこそ意味がわかりません。
大体のサイトが操作を説明するにとどめているので、そういうものだと思うことにしました。
話を戻します。
例えば、test.fileというファイルの最終更新日を現在に変更するには
touch test.file
とコマンドを入力します。
ファイルの中身は変更せずにtouchコマンドを実行することで最終更新日が変更されます。
何らかの理由でファイルの中身を変更せずに最終更新日を変更するというのが用途の一つです。
なんのために?とは思いますがそういう機能があるということが大事なんだと思います。
touchコマンドのオプション
コマンドのオプションとして以下があります。
| Option | Description |
|---|---|
| -t | [[CC]YY]MMDDhhmm[.ss]の書式に則り、タイムスタンプを指定した日時に更新します。 |
| -d | 日時を文字列で指定して、タイムスタンプを更新します。 |
| -c | 存在しないファイル名を指定しても、空の新規ファイルを作成しません。 |
| -r | 指定した他のファイルのタイムスタンプに合わせて更新されます。 |
| -m | ctimeのみを変更します。 |
-cオプションなどは意味がわかりませんでしたが、最終更新日変更する際にファイル名指定間違いをした場合に余計なファイルを作成することを防ぐ用途なんだと思います。
ファイルの作成
こちらは使い慣れていると思います。
以下のコマンドでファイルを作成することができます。
touch ファイル名
新規ファイルが作成されます。
はいそこEditorで作成するから使わないとか言わない。
【2026-08-15 追記】-mの説明が違うのと、当時わからなかった用途の答え
ここから下は2026年8月のterralienが後から足した追記です。当時の本文は直していません。この記事は最後に「最終更新日をいじる意味は偽装以外になにかあるのか」と書いて読者に質問を投げたまま4年放置していました。答えはありますので、表の間違い1件とあわせて足します。
訂正: -mはctimeではなくmtimeです
本文の表は「-m ctimeのみを変更します」としていますが、間違いです。Linuxのファイルは時刻を3つ持っています。
| 略 | 名前 | 何の時刻か | touchで指定できるか |
|---|---|---|---|
| mtime | Modify | 中身が最後に書き換わった時刻 | できる(-m) |
| atime | Access | 最後に読まれた時刻 | できる(-a) |
| ctime | Change | inode(権限・所有者・リンク数など)が最後に変わった時刻 | できない |
ctimeはユーザーが好きな値に設定できません。カーネルが「変更が起きた」事実として勝手に打つもので、touchで何をしてもctimeは必ず「今」に更新されます。3つ全部を見るにはstatです。
stat test.file
# Access: 2026-08-15 09:00:00
# Modify: 2026-08-15 09:00:00
# Change: 2026-08-15 09:00:00 ← ここは指定できない
touch -m -t 202001010000 test.file # mtimeだけ2020年にする
stat test.file # Modifyは2020年、Changeは「今」
これはタイムスタンプ偽装が完全にはできないということでもあります。本文で「改ざんするためのもの」という説明に納得できなかったのは、たぶん半分正しくて、mtimeは動かせてもctimeは残るからです。
当時わからなかった「最終更新日をいじる意味」
本文は用途が見つからずコメントで教えてほしいと書いて終わっていますが、用途は「人が日付を見るため」ではなく「機械が日付を比べるため」でした。そう考えると一気に腑に落ちます。
| 場面 | 何のためにtouchするか |
|---|---|
makeなどのビルド |
makeは「ソースのmtime > 成果物のmtime」だけを見て再ビルドするか決める。中身を1文字も変えずにtouchすると強制的に作り直させられる |
差分バックアップ・rsync |
転送するかどうかの判定がmtime。意図的に新しくして送り直させる/古いままにして送らせない |
| フラグファイル(sentinel) | 「処理が最後に成功した時刻」を空ファイルのmtimeとして置いておく。次回はfind -newerでそれ以降のファイルだけ拾える |
| ログローテーション・掃除 | find /tmp -mtime +7 -deleteのような「古いものを消す」処理の動作確認。-tで古い日付のファイルを作れば実際に消えるか試せる |
# 前回成功時刻より後に更新されたファイルだけ処理する、という書き方
find ./data -newer .last_run -type f
# 処理が終わったらフラグを今に更新
touch .last_run
この.last_runの使い方が、たぶんいちばん日常的なtouchの出番です。ファイルを作りたいわけでも日付をごまかしたいわけでもなく、「ここまで終わった」という印を1バイトも使わずに置いているわけですね。
——なお4年経った今も、わたしがtouchを打つ回数の9割は空ファイル作成です。用途を知ったからといって使い方が変わるとは限らないという話でした。
【2026-08-15 追記ぶんの出典】touch(1) - Linux manual page(-a/-mが対応する時刻)/stat(2) - Linux manual page(atime・mtime・ctimeの定義)/POSIX.1-2017 — make(ターゲットより新しい前提条件があるときに再構築する、という更新判定)
学んだこと
touchコマンドの操作方法やオプションを学びました。
学びましたが、ファイル作成はともかく最終更新日をいじる意味は偽装以外になにかあるのかいまいちわからずモヤっていますw
どなたか初学者にコメントなどでご教授ください。
あと完全に余談ですがMarkdownで編集するためにGithuberというpluginを入れたら生産性が爆上がりとなりました。新規インストールで検索してみて下さい。
参考資料


前回学んだLinux基礎
