「ファイルの更新日時を特定の日付に変更したいのに、オプションの書式がわからない」
Linuxの現場では、ログ管理やバックアップの基準日設定、シェルスクリプトでのロックファイル作成など、ファイルのタイムスタンプを操作する場面が意外と多くあります。
この記事では、Linuxの
touch コマンドの基本から実務で役立つ応用テクニックまで解説します。空ファイルの作成、タイムスタンプの変更(
-t/-d オプション)、参照ファイルからの日時コピー(-r)、find との組み合わせによる一括変更、トラブルシュートまで網羅しました。touchコマンドとは?基本構文と動作
touch は、ファイルのタイムスタンプ(アクセス時刻・修正時刻)を変更するコマンドです。指定したファイルが存在しない場合は、サイズ0バイトの空ファイルを新規作成します。基本構文は以下の通りです。
# ファイルのタイムスタンプを現在時刻に変更する(存在しなければ新規作成) # touch ファイル名
atime・mtime・ctimeの違い
touchコマンドを正しく使うには、Linuxのタイムスタンプの仕組みを理解しておく必要があります。ファイルには3種類のタイムスタンプがあります。・atime(Access Time):ファイルを最後に読み取った日時。
cat や less で内容を表示した時に更新される・mtime(Modify Time):ファイルの内容を最後に変更した日時。
vi で編集・保存した時に更新される。ls -l で表示されるのはこの時刻・ctime(Change Time):ファイルのメタデータ(パーミッション・所有者など)を最後に変更した日時。
chmod や chown を実行した時に更新される※ ctimeはtouchコマンドでは直接変更できません。ctimeはファイルのinode情報が変わった時にカーネルが自動更新するものです。touchで変更できるのはatimeとmtimeの2つです。
タイムスタンプの確認には
stat コマンドを使います。# ファイルの全タイムスタンプを確認する # stat sample.txt File: sample.txt Size: 1024 Blocks: 8 IO Block: 4096 regular file Access: 2024-03-15 10:30:00.000000000 +0900 Modify: 2024-03-10 14:20:00.000000000 +0900 Change: 2024-03-10 14:20:00.000000000 +0900
基本オプション一覧
touch コマンドでよく使うオプションを押さえておきましょう。・-a:アクセス時刻(atime)のみ変更する
・-m:修正時刻(mtime)のみ変更する
・-t [[CC]YY]MMDDhhmm[.SS]:指定した日時に変更する
・-d 日付文字列:自然な日付文字列で時刻を指定する(例: "2024-01-15 10:30")
・-r 参照ファイル:参照ファイルと同じタイムスタンプに変更する
・-c:ファイルが存在しない場合、新規作成しない
空ファイルの作成(基本操作)
1. 空ファイルを1つ作成する
最もシンプルな使い方です。存在しないファイル名を指定すると、サイズ0バイトのファイルが作成されます。# 空ファイルを作成する # touch newfile.txt # 確認する # ls -l newfile.txt -rw-r--r-- 1 user user 0 Mar 15 10:00 newfile.txt
2. 複数の空ファイルをまとめて作成する
ファイル名をスペース区切りで複数指定すれば、一度に複数のファイルを作成できます。# 3つの空ファイルをまとめて作成する # touch file1.txt file2.txt file3.txt # 連番ファイルをブレース展開で一括作成する # touch log_{01..10}.txt
3. 既存ファイルを作成しない(-c オプション)
-c オプションを付けると、ファイルが存在しない場合に新規作成しません。「ファイルが存在する時だけタイムスタンプを更新したい」という場面で使います。# ファイルが存在する場合のみタイムスタンプを更新する(なければ何もしない) # touch -c existing.txt
タイムスタンプの変更
1. 現在時刻に更新する
オプションなしでtouchを実行すると、ファイルのatime・mtimeが現在時刻に更新されます。# タイムスタンプを現在時刻に更新する # touch sample.txt # 確認する # stat sample.txt | grep -E "Access|Modify" Access: 2024-03-15 15:00:00.000000000 +0900 Modify: 2024-03-15 15:00:00.000000000 +0900
2. -t オプションで日時を指定する
-t オプションでは、[[CC]YY]MMDDhhmm[.SS] の形式で日時を指定します。# 2024年1月15日 10時30分に変更する # touch -t 202401151030 sample.txt # 秒まで指定する場合 # touch -t 202401151030.45 sample.txt
・CC:世紀(20)※省略可
・YY:年(24)※省略可
・MM:月(01~12)
・DD:日(01~31)
・hh:時(00~23)
・mm:分(00~59)
・.SS:秒(00~59)※省略可
3. -d オプションで日付文字列を指定する
-d オプションは、より直感的な日付文字列を使えます。-t の数字羅列が覚えにくいという方はこちらが便利です。# 日時を文字列で指定する # touch -d "2024-01-15 10:30" sample.txt # 日付のみ指定する(時刻は00:00:00になる) # touch -d "2024-01-15" sample.txt # 相対的な日時指定もできる # touch -d "2 days ago" sample.txt # touch -d "yesterday" sample.txt
4. アクセス時刻だけ変更する(-a)
-a オプションを使うと、atimeのみを変更し、mtimeはそのまま維持します。# アクセス時刻だけを現在時刻に変更する # touch -a sample.txt # 特定の日時でアクセス時刻だけ変更する # touch -a -t 202401151030 sample.txt
5. 修正時刻だけ変更する(-m)
-m オプションを使うと、mtimeのみを変更し、atimeはそのまま維持します。# 修正時刻だけを現在時刻に変更する # touch -m sample.txt # 特定の日時で修正時刻だけ変更する # touch -m -t 202401151030 sample.txt
6. 参照ファイルのタイムスタンプをコピーする(-r)
-r オプションを使うと、別のファイルと同じタイムスタンプに揃えられます。複数ファイルの日時を統一したい場面で重宝します。# reference.txt と同じタイムスタンプに変更する # touch -r reference.txt target.txt # 確認する # stat reference.txt target.txt | grep Modify Modify: 2024-01-10 09:00:00.000000000 +0900 Modify: 2024-01-10 09:00:00.000000000 +0900
実務で使えるtouchの応用テクニック
1. シェルスクリプトでのロックファイル
シェルスクリプトの二重起動を防ぐ「ロックファイル」として、touchによる空ファイル作成がよく使われます。#!/bin/bash LOCKFILE="/tmp/myscript.lock" # ロックファイルが存在すれば終了する if [ -f "$LOCKFILE" ]; then echo "既に実行中です。" exit 1 fi # ロックファイルを作成する touch "$LOCKFILE" # メインの処理 echo "処理を実行中..." # 処理完了後、ロックファイルを削除する rm -f "$LOCKFILE"
2. find + touch でタイムスタンプを一括変更する
特定の条件に合うファイルのタイムスタンプをまとめて変更したい場合、find と touch を組み合わせます。# /var/log/ 配下の .log ファイルのタイムスタンプを現在時刻に一括更新する # find /var/log/ -name "*.log" -exec touch {} \; # 特定の日時に一括変更する # find /var/log/ -name "*.log" -exec touch -t 202401010000 {} \;
3. 参照ファイルを基準にタイムスタンプを統一する
デプロイ後にファイルの更新日時がバラバラになってしまった場合など、基準ファイルに揃えたい時に使えるテクニックです。# /var/www/html/ 配下の全ファイルを index.html のタイムスタンプに揃える # find /var/www/html/ -type f -exec touch -r /var/www/html/index.html {} \;
4. makeのビルド制御に使う
make はファイルのmtimeを基準にビルドの要否を判断します。特定のファイルだけ強制的に再ビルドしたい場合、touchでmtimeを更新するテクニックがあります。# main.c のタイムスタンプを更新して、make で再ビルドさせる # touch main.c # make
「Permission denied」が出た時の対処法
touchコマンドで最もよく遭遇するエラーが「Permission denied」です。原因と対処法を整理しておきましょう。1. ディレクトリへの書き込み権限がない場合
新規ファイルの作成は、そのディレクトリに書き込み権限が必要です。# 一般ユーザーで /etc 配下にファイルを作ろうとするとエラーになる $ touch /etc/myfile.txt touch: cannot touch '/etc/myfile.txt': Permission denied # sudo を付けて実行する $ sudo touch /etc/myfile.txt
2. ファイルの所有者でない場合
既存ファイルのタイムスタンプを変更するには、そのファイルの所有者であるか、root権限が必要です。# 他のユーザーが所有するファイルのタイムスタンプは変更できない $ touch /var/log/messages touch: setting times of '/var/log/messages': Operation not permitted # sudo を使って変更する $ sudo touch /var/log/messages
3. ファイルシステムがリードオンリーの場合
ファイルシステムが読み取り専用でマウントされている場合も、touchは失敗します。# リードオンリーの場合のエラー $ touch /mnt/readonly/file.txt touch: cannot touch '/mnt/readonly/file.txt': Read-only file system # マウント状態を確認する # mount | grep /mnt/readonly
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 空ファイルを作成する | touch ファイル名 |
| 複数の空ファイルを一括作成する | touch file1.txt file2.txt file3.txt |
| タイムスタンプを現在時刻に更新する | touch ファイル名 |
| 日時を指定して変更する(-t形式) | touch -t 202401151030 ファイル名 |
| 日時を指定して変更する(-d形式) | touch -d "2024-01-15 10:30" ファイル名 |
| アクセス時刻だけ変更する | touch -a ファイル名 |
| 修正時刻だけ変更する | touch -m ファイル名 |
| 参照ファイルのタイムスタンプをコピーする | touch -r 参照ファイル 対象ファイル |
| ファイルが存在する時だけ更新する | touch -c ファイル名 |
| タイムスタンプを一括変更する | find パス -name "*.log" -exec touch {} \; |
touchコマンド、空ファイル作成だけで終わっていませんか?
タイムスタンプの操作はログ管理やバックアップ運用の基礎です。オプションを正しく使い分けられれば、シェルスクリプトやcronと組み合わせた自動化の幅が大きく広がります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
