LinuxやmacOSなどのBash環境において、ファイル操作の基本コマンドとして欠かせないのが「touch」コマンドです。
多くのユーザーは空のファイルを新規作成する際にこのコマンドを利用しますが、本来の役割はファイルのタイムスタンプを更新・変更することにあります。
システムのメンテナンスやバックアップ処理、ビルドツールの動作検証など、タイムスタンプを意図的に操作しなければならない場面は少なくありません。
この記事では、touchコマンドの基本的な使い方から、特定の日時を指定する方法、複数のタイムスタンプを使い分けるテクニックまでを詳しく解説します。
touchコマンドの基本的な役割と動作
touchコマンドは、指定したファイルのアクセス時刻(atime)と修正時刻(mtime)を現在の時刻に更新するためのコマンドです。
引数に指定したファイルが存在しない場合、デフォルトではサイズが0の空ファイルを新規に作成します。
まずは、最もシンプルな実行例を見てみましょう。
# sample.txtというファイルを作成、または現在の時刻に更新
touch sample.txt
このコマンドを実行すると、カレントディレクトリにファイルがない場合は新規作成され、すでにある場合はタイムスタンプのみが実行時の時刻に書き換えられます。
現在のファイルのステータスを確認するには、statコマンドを併用するのが一般的です。
# ファイルのステータスを表示
stat sample.txt
File: sample.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 1234567 Links: 1
Access: 2026-05-12 10:00:00.000000000 +0900
Modify: 2026-05-12 10:00:00.000000000 +0900
Change: 2026-05-12 10:00:00.000000000 +0900
Birth: -
3種類のタイムスタンプ(atime / mtime / ctime)の違い
Linuxのファイルシステムでは、1つのファイルに対して主に3種類のタイムスタンプが管理されています。
touchコマンドを使いこなすためには、これらの違いを正確に理解しておく必要があります。
それぞれの意味は以下の通りです。
| 名称 | 略称 | 説明 |
|---|---|---|
| アクセス時刻 | atime | ファイルの内容が最後に読み取られた時刻(catやcpなど)。 |
| 修正時刻 | mtime | ファイルの内容が最後に変更・書き込みされた時刻。 |
| 変更時刻 | ctime | ファイルの属性(所有者、権限、名前など)や内容が最後に変更された時刻。 |
ここで重要なのは、ctimeはユーザーが直接touchコマンドで任意の日時に指定することはできないという点です。
atimeやmtimeを書き換えた際、ファイルの情報自体が更新されたとみなされるため、副次的にctimeも実行時の現在時刻に更新されます。
アクセス日時(atime)のみを更新する方法
ファイルの内容は変更せず、読み取った日時だけを更新したい場合は、-aオプションを使用します。
「a」は「access」の略称です。
# アクセス日時(atime)だけを現在の時刻に更新
touch -a sample.txt
このコマンドを実行しても、修正時刻(mtime)は変化しません。
特定のログファイルやキャッシュファイルが「最後にいつ利用されたか」のみを更新したい場合に有用です。
更新日時(mtime)のみを更新する方法
一方で、ファイルの最終更新日だけを変更したい場合は、-mオプションを使用します。
「m」は「modify」の略称です。
# 修正時刻(mtime)だけを現在の時刻に更新
touch -m sample.txt
プログラムのビルドツール(makeなど)は、このmtimeを参照してコンパイルが必要かどうかを判断します。
ソースコードを書き換えていないものの、強制的に再コンパイルを実行させたい場合などに、このtouch -mがよく使われます。
特定の日時を指定してタイムスタンプを更新する
「現在時刻」ではなく、「2025年1月1日」といった過去や未来の任意の日時を設定することも可能です。
これには主に2つの方法があります。
-t オプションによる書式指定
1つ目は、[[CC]YY]MMDDhhmm[.ss]という形式で指定する-tオプションです。
# 2026年12月25日 15時30分00秒に設定
touch -t 202612251530.00 sample.txt
書式の内訳は、「西暦(4桁)月(2桁)日(2桁)時(2桁)分(2桁).秒(2桁)」となります。
短縮して記述することも可能ですが、意図しない誤作動を防ぐためにフル桁で記述することを推奨します。
-d オプションによる柔軟な指定
2つ目は、より人間が理解しやすい文字列で指定できる-dオプションです。
こちらのオプションは非常に柔軟で、様々な形式を受け付けます。
# 日付形式で指定
touch -d "2026-08-01 12:00:00" sample.txt
# 相対的な時間で指定(1日前)
touch -d "1 day ago" sample.txt
# 明日の同時刻に設定
touch -d "tomorrow" sample.txt
スクリプト内で「昨日の日付に合わせたい」といった処理を記述する場合、-dオプションの方が可読性が高くなります。
他のファイルを基準にタイムスタンプをコピーする
あるファイル(ファイルA)のタイムスタンプを、別のファイル(ファイルB)と全く同じにしたい場合があります。
この場合、-rオプション(reference)が便利です。
# source.txtの時刻をtarget.txtにコピーする
touch -r source.txt target.txt
手動で時刻を調べて入力する手間が省けるため、バックアップからファイルを復元した際などに、元のファイルと時刻を同期させる目的で使用されます。
新規ファイルを作成したくない場合
デフォルトのtouchコマンドは、指定したファイルが存在しないと空ファイルを自動作成してしまいます。
「ファイルが存在する場合のみタイムスタンプを更新し、存在しない場合は何もしない」という挙動をさせたいときは、-cオプション(–no-create)を指定します。
# ファイルが存在すれば更新、存在しなければ作成しない
touch -c missing_file.txt
このオプションは、一括処理を行うシェルスクリプトなどで、不要な空ファイルが大量に生成されるのを防ぐために重要です。
シンボリックリンク自体のタイムスタンプを変更する
通常、シンボリックリンクに対してtouchを実行すると、リンク先のファイルのタイムスタンプが更新されます。
そうではなく、シンボリックリンクそのものの日時を変更したい場合は、-hオプションを併用します。
# シンボリックリンク自体のタイムスタンプを変更
touch -h symlink_file
リンク自体の作成日時などを管理したい場合には必須となるオプションです。
複数のファイルを一括で更新する
Bashのワイルドカード機能を利用すれば、ディレクトリ内の全てのファイルに対して一括で処理を行うことができます。
# 拡張子が .log のファイルを全て現在時刻に更新
touch *.log
# ディレクトリ内の全ファイルのmtimeを特定の日時に変更
touch -m -d "2026-01-01" *
大量のファイルを扱う際は、実行前に ls などで対象を確認してから実行するようにしましょう。
実務での活用シーン
touchコマンドの活用は、単なるファイル作成にとどまりません。
例えば、条件付きのバックアップにおいて非常に有用です。
findコマンドには、特定の時刻よりも新しいファイルを検索するオプションがあります。
# 基準となるタイムスタンプファイルを作成
touch -t 202605120000 marker_file
# marker_fileより後に更新されたファイルを探す
find . -newer marker_file
このように、特定の時点を示す「マーカー」として空ファイルを利用し、それ以降に更新された差分ファイルだけを抽出するといった運用が可能です。
また、アプリケーションのテストにおいて、ファイルの有効期限が切れた状態をシミュレートするために、未来や過去の日付をセットすることもあります。
まとめ
Bashのtouchコマンドは、ファイルのタイムスタンプを自在に操るための強力なツールです。
単なる「ファイル作成コマンド」としてだけでなく、atime(アクセス時刻)とmtime(修正時刻)を個別に制御できる点や、-dや-rによる柔軟な指定方法を覚えることで、システム管理の効率は飛躍的に向上します。
特に-cオプションによる「空ファイル作成の防止」や、-hオプションによる「シンボリックリンクの操作」は、スクリプト作成におけるミスを防ぐために欠かせない知識です。
まずはstatコマンドで現在のファイルの状況を確認しながら、touchコマンドで思い通りの日時変更ができるか試してみてください。
正確なタイムスタンプ管理は、トラブルシューティングやデータ整合性の維持において、非常に重要な役割を果たします。
