MENU

ファイルの更新日時を現時刻・任意の日時に書き換える実務手順

目次

まず結論:タイムスタンプを現時刻に更新する

ファイルのタイムスタンプを現時刻に更新するには、touch コマンドにファイル名を渡すだけです。

# タイムスタンプを現時刻に更新する
touch target.conf

# 更新後を確認(Modify: 行が現時刻になっていれば成功)
stat target.conf

stat コマンドの出力にある Modify: 行が現時刻に変わっていれば成功です。ファイルだけでなくディレクトリも同様に指定できます。

# ディレクトリのタイムスタンプを更新する例
touch /var/log/myapp/

Linuxのタイムスタンプは3種類ある

ls -l で表示される日時は「更新日時(mtime)」だけですが、Linuxのファイルには実務で意識すべきタイムスタンプが3種類あります。stat コマンドを使うとすべて確認できます。

$ stat example.txt
  File: example.txt
  Size: 1024      Blocks: 8       IO Block: 4096   regular file
Device: 8,1       Inode: 131074   Links: 1
Access: 2025-06-10 09:15:22.123456789 +0900   ← atime(最終アクセス日時)
Modify: 2025-06-10 09:15:22.123456789 +0900   ← mtime(最終内容更新日時)
Change: 2025-06-10 09:15:22.123456789 +0900   ← ctime(inode変更日時)
種別意味touchで変更
mtimeファイルの内容を最後に変更した日時○(デフォルト)
atimeファイルを最後に読み取った日時○(-a オプション)
ctimeパーミッション・所有者など inode を最後に変更した日時×(カーネルが自動更新)

ctime は touch では直接変更できません。mtime を書き換えると ctime も現時刻に更新されます。また、現代のディストリビューションでは /etc/fstabrelatime が設定されているケースがほとんどで、atime は「mtime より古い場合のみ更新」される挙動になっています。

任意の日時を指定してタイムスタンプを書き換える

現時刻ではなく特定の日時を設定したい場面では、-d オプションか -t オプションを使います。

-d オプション(人間が読みやすい書式)

# 2025年6月1日 09:00:00 に設定
touch -d "2025-06-01 09:00:00" target.conf

# 相対指定も可能
touch -d "yesterday" target.conf
touch -d "2 hours ago" target.conf
touch -d "30 days ago" archive/old-report.csv

-t オプション(数値書式)

# 書式: [[CC]YY]MMDDhhmm[.ss]
# 2025年6月1日 09:00:00 に設定
touch -t 202506010900.00 target.conf

-d の相対表現はシェルスクリプトでの自動化と相性がよく、「N日前のファイルとして扱う」テスト環境の構築に重宝します。UTC とローカルタイムの扱いは環境によって異なるため、重要な操作では stat で結果を確認してから次のステップへ進むのが安全です。

ファイルが存在しない場合の挙動と安全なオプション

touch の重要な副作用として、指定したファイルが存在しない場合は空ファイルが新規作成されます。意図しないファイル作成を避けたいときは -c オプションを使います。

# ファイルが存在しない場合は新規作成される(デフォルト動作)
touch newfile.txt

# -c を付けると「存在するファイルのみ更新」になり、存在しなければ何もしない
touch -c existing.conf

スクリプト内で「マーカーファイルを作成しておき、次回実行時に更新する」という用途ではデフォルト動作が便利です。逆に、既存ファイルだけを対象にしたい場合は必ず -c を付けてください。

実務でタイムスタンプ操作が必要になる主な場面

make の再ビルドを強制する

make はターゲットと依存ファイルの mtime を比較してビルドの要否を判定します。ソースを変更せずに再ビルドを強制したいとき、依存ファイルのタイムスタンプを更新する方法が使われます。

# 特定ヘッダを「最新」として扱わせ、依存モジュールをすべて再ビルドさせる
touch src/config.h
make

バックアップ・監視ツールの動作確認

バックアップソフトや差分監視ツールは、前回チェック以降に mtime が変化したかどうかでファイルの変更を検出します。内容を変えずに「変更あり」として検出させたい場合、タイムスタンプを更新するだけで代替できます。ある運用現場では、定期バックアップのリストア訓練で意図的に古い mtime をセットし「バックアップ対象外のファイル」を再現するという使い方をしていました。

# バックアップ範囲から外れた「古いファイル」を再現する
touch -d "30 days ago" archive/old-report.csv

# 逆に「今変更された」として検出させる
touch logs/app.log

CI/CD のデプロイ状態をマーカーファイルで管理する

デプロイスクリプト内で「最終デプロイ日時」をファイルの mtime として記録しておき、後続スクリプトがその mtime と現時刻を比較して再デプロイ要否を判断するパターンも実務でよく見かけます。

#!/bin/bash
MARKER="/var/lib/myapp/.last_deployed"

# デプロイ完了後にマーカーファイルを現時刻で更新
touch "$MARKER"

# 最終デプロイ日時を確認
stat "$MARKER" | grep Modify

注意点と落とし穴

noatime / relatime マウントオプション
現代のLinuxディストリビューションでは、パフォーマンス向上のため relatime(または noatime)がデフォルトで有効になっているケースがほとんどです。touch -a で atime を書き換えた直後に読み取りが発生しても、atime が再更新されない場合があります。atime を厳密に管理する必要がある場面では、まずマウントオプションを確認してください。

# マウントオプションを確認する
findmnt -o TARGET,OPTIONS /

ctime は変更できない
ctime はカーネルが自動的に管理するため、ユーザー操作では直接書き換えられません。フォレンジック調査などでは ctime が改ざんされていないかを確認することが多く、セキュリティ上の重要な指標になります。mtime だけ書き換えても ctime が現時刻になることから、ログ解析では両者を突き合わせる習慣が有効です。

ファイルシステムの精度に注意
ext4 や xfs では1ナノ秒単位のタイムスタンプを保持していますが、FAT や NTFS(Windows との共有ストレージ)では精度が落ちます。クロスプラットフォームな環境でタイムスタンプ管理をする場合は、使用しているファイルシステムの仕様を事前に確認してください。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次