MENU

ファイルの更新日時を任意の時刻に書き換える実務手順|バックアップ・検証にも活用

ファイルの更新日時を特定の日時に変更したい場面は、バックアップ検証・デプロイ確認・ログのテストデータ作成など、実務でよく出てきます。結論から言えば、touch -d または touch -t を使えば数秒で任意の日時に書き換えられます。

目次

基本:任意の日時にタイムスタンプを変更する

最も直感的なのは -d オプションで人間が読める形式の文字列を渡す方法です。

# 「2024年3月15日 09:30」に変更する例
touch -d "2024-03-15 09:30:00" target_file.log

# 「3日前」「1週間前」などの相対指定も使える
touch -d "3 days ago" target_file.log
touch -d "last Monday 08:00" target_file.log

変更後は ls -l または stat で確認します。

$ stat target_file.log
  File: target_file.log
  Size: 0
Access: 2024-03-15 09:30:00.000000000 +0900
Modify: 2024-03-15 09:30:00.000000000 +0900
Change: 2026-07-25 10:12:34.123456789 +0900

Change(ctime)だけは変わっていることに注意してください。これはカーネルが管理するメタデータ更新時刻で、ユーザーが直接書き換える手段はありません。

数値指定が必要な場面:-t オプションの書式

スクリプト内で厳密に日時を指定したい場合や、古い環境との互換を保ちたい場合は -t オプションを使います。書式は [[CC]YY]MMDDhhmm[.ss] です。

# 2024年1月1日 11:23:00 に変更(世紀・年・秒まで指定)
touch -t 202401011123.00 target_file.log

# 年の省略(現在の年が補完される)
touch -t 01011123 target_file.log

# 秒まで指定する場合
touch -t 202403150930.45 target_file.log

フィールドの意味は以下の通りです。

CC  : 世紀(20 など、省略可)
YY  : 年の下2桁(省略可)
MM  : 月(01〜12)
DD  : 日(01〜31)
hh  : 時(00〜23)
mm  : 分(00〜59)
.ss : 秒(省略可)

スクリプトで動的に日時を組み立てる場合は、date コマンドと組み合わせるのが確実です。

# 「7日前の同じ時刻」をtouch -t 形式で生成して適用する
TIMESTAMP=$(date -d "7 days ago" +"%Y%m%d%H%M.%S")
touch -t "$TIMESTAMP" target_file.log

別ファイルのタイムスタンプをそのままコピーする

「参照元ファイルと同じ日時にそろえたい」という場面には --reference(短縮形 -r)が便利です。デプロイ後に設定ファイルの日時をテンプレートにそろえる、といった用途で重宝します。

# reference_file.conf の日時を target_file.conf にコピーする
touch -r reference_file.conf target_file.conf

# 複数ファイルにまとめて適用する
touch -r master.conf app.conf db.conf cache.conf

atime・mtime を個別に変更する

デフォルトでは touch はアクセス時刻(atime)と更新時刻(mtime)の両方を変更します。どちらか一方だけを変えたい場合は -a または -m を追加します。

# mtime(更新時刻)だけを変更する(atimeはそのまま)
touch -m -d "2024-06-01 00:00:00" target_file.log

# atime(アクセス時刻)だけを変更する
touch -a -d "2024-06-01 00:00:00" target_file.log

ログ監視ツールや差分バックアップは mtime を基準にすることが多いため、atime だけ変えればツール側の動作に影響を与えずに済みます。

実務での活用パターン

バックアップスクリプトのテスト:rsync や差分バックアップは mtime の変化でコピー対象を判断します。テストデータとして「1週間前に更新されたファイル」を意図的に作成することで、バックアップの動作を再現できます。

# テスト用ファイルを作成し、7日前の日時を付ける
for i in $(seq 1 5); do
  touch -d "7 days ago" "/tmp/testdata/file_${i}.dat"
done

ログローテーションの検証:logrotate の設定が「30日以上古いログを削除」といった条件を持つ場合、ダミーログのタイムスタンプを過去に設定すれば動作を即座に確認できます。ある運用現場では、本番ログに手を加えることなくローテーション設定の検証を完結させるために、この手法を標準的な手順として採用しています。

デプロイ確認:CI/CD パイプライン後に設定ファイルが正しく配置されたかを mtime で確認するスクリプトを持つ現場では、タイムスタンプの書き換えによってロールバック後の状態を意図的に作り出し、アラート検知のテストをすることができます。

注意点と落とし穴

ctime は変更できないstatChange 欄(ctime)は inode メタデータの変更時刻であり、ユーザースペースから書き換えることはできません。タイムスタンプを変更した事実自体は ctime に残ります。これをセキュリティ監査に使っているシステムでは、タイムスタンプを書き換えても証跡が残る点を把握しておく必要があります。

ファイルシステムの精度による制限:FAT32 など一部のファイルシステムは 2 秒単位の精度しか持ちません。ext4・XFS・Btrfs といった現代的な Linux ファイルシステムであれば、ナノ秒精度でタイムスタンプを保持できます。

タイムゾーンに注意-d でタイムゾーンを指定しない場合、システムのローカルタイムとして解釈されます。UTC で管理しているサーバーに JST の日時をそのまま渡すとずれが生じるため、明示的に指定するか TZ 環境変数を合わせてから実行します。

# タイムゾーンを明示して指定する
touch -d "2024-03-15 09:30:00 JST" target_file.log

# または TZ 環境変数で制御する
TZ="Asia/Tokyo" touch -d "2024-03-15 09:30:00" target_file.log

権限の確認:自分が所有するファイルであればタイムスタンプを自由に変更できます。他のユーザーが所有するファイルは、書き込み権限があっても「現在時刻へのリセット」しか行えません。任意の日時に変更するには所有者であるか root 権限が必要です。

# 権限が不足している場合のエラー例
$ touch -d "2024-01-01 00:00" /var/log/syslog
touch: cannot touch '/var/log/syslog': Permission denied

# 必要な場合は sudo で実行する
sudo touch -d "2024-01-01 00:00" /var/log/syslog

<PR>この記事に関連するおすすめ書籍

[試して理解]Linuxのしくみ 増補改訂版

プロセス・ファイルシステム・権限などLinuxの内部構造を図解で理解できる一冊。運用判断の勘所が腑に落ちます。

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

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

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

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

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

この記事を書いた人

目次