「バックアップファイルのタイムスタンプを元のファイルに合わせたい」
「スクリプトでファイルを作成するとき、日付を意図的にずらしたい」
こんな場面で使うのが
touch コマンドです。この記事では、touchコマンドでファイルのタイムスタンプ(修正日時)を変更する方法を解説します。
基本的な
-t オプションから、別ファイルに日時を合わせる -r オプション、文字列形式で指定できる -d オプション、新規ファイル作成への応用、よくあるエラーの対処法まで順番にまとめました。・touch -t CCYYMMDDhhmm ファイル名 で任意の日時にタイムスタンプを変更できる
・touch -r 参照ファイル 対象ファイル で別ファイルに日時を揃えることができる
・touch ファイル名 だけで空ファイルの新規作成も可能
・他ユーザー所有ファイルへの変更は root権限(sudo)が必要になる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
touchコマンドとは
touchコマンドは本来「ファイルのタイムスタンプを更新する」コマンドです。オプションなしで実行すると「現在時刻」に更新されますが、
-t オプションで任意の日時に変更できます。Linuxのファイルには以下の3種類のタイムスタンプが記録されています。
・atime(アクセス時刻):ファイルを最後に読み込んだ日時
・mtime(修正時刻):ファイルの内容を最後に変更した日時
・ctime(変更時刻):ファイルのメタデータ(パーミッション等)を変更した日時
ls -l で表示される日時は mtime(修正時刻)です。touchコマンドで変更するのも基本的にはこの mtime です。3種類すべてを確認したい場合は
stat コマンドを使います。[pakira@Dolphin ~]$ stat du_file File: du_file Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd01h/64769d Inode: 131073 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ pakira) Gid: ( 1000/ pakira) Access: 2026-04-04 09:15:00.000000000 +0900 # atime Modify: 2026-01-01 11:23:00.000000000 +0900 # mtime Change: 2026-04-04 09:15:00.000000000 +0900 # ctime Birth: -
基本的な使い方
1. タイムスタンプを任意の日時に変更する(-t オプション)
-t オプションに続けて変更したい日時を指定します。書式:
touch -t [[CC]YY]MMDDhhmm[.ss] ファイル名
・CC:西暦の上2桁(省略可。省略すると現世紀に補完)
・YY:西暦の下2桁(省略可)
・MM:月(01~12)
・DD:日(01~31)
・hh:時(00~23)
・mm:分(00~59)
・.ss:秒(省略可)
実行例:月日・時分だけで変更する
[pakira@Dolphin du_test]$ ls -l 合計 4 -rw-r--r-- 1 pakira pakira 0 Feb 5 10:00 du_file # ↑変更前のタイムスタンプを確認します。 [pakira@Dolphin du_test]$ touch -t 01011123 du_file # ↑タイムスタンプを「1月1日 11時23分」に変更します。 [pakira@Dolphin du_test]$ ls -l 合計 4 -rw-r--r-- 1 pakira pakira 0 Jan 1 11:23 du_file # ↑タイムスタンプが変更されました。
# 2024年3月15日 09時30分に変更する [pakira@Dolphin ~]$ touch -t 202403150930 du_file [pakira@Dolphin ~]$ ls -l du_file -rw-r--r-- 1 pakira pakira 0 Mar 15 2024 du_file
# 2024年3月15日 09時30分45秒に変更する [pakira@Dolphin ~]$ touch -t 202403150930.45 du_file [pakira@Dolphin ~]$ stat du_file | grep Modify Modify: 2024-03-15 09:30:45.000000000 +0900 # ↑秒まで正確に設定されました。
2. 別ファイルのタイムスタンプに合わせる(-r オプション)
-r オプションを使うと、参照ファイルと同じタイムスタンプを設定できます。バックアップファイルのタイムスタンプを元ファイルに揃えたい場面で特に便利です。
# original.txt のタイムスタンプを backup.txt に合わせる [pakira@Dolphin ~]$ ls -l original.txt backup.txt -rw-r--r-- 1 pakira pakira 256 Apr 10 14:30 backup.txt -rw-r--r-- 1 pakira pakira 256 Jan 15 09:00 original.txt [pakira@Dolphin ~]$ touch -r original.txt backup.txt [pakira@Dolphin ~]$ ls -l original.txt backup.txt -rw-r--r-- 1 pakira pakira 256 Jan 15 09:00 backup.txt -rw-r--r-- 1 pakira pakira 256 Jan 15 09:00 original.txt # ↑backup.txt のタイムスタンプが original.txt と一致しました。
3. 現在時刻に更新する(オプションなし)
オプションなしで実行すると、タイムスタンプが「現在時刻」に更新されます。ファイルを「今触った」状態にしたいときに使います。
[pakira@Dolphin ~]$ touch du_file [pakira@Dolphin ~]$ ls -l du_file -rw-r--r-- 1 pakira pakira 0 Apr 4 09:15 du_file # ↑コマンド実行時刻に更新されました。
4. 空の新規ファイルを作成する
touch は空ファイルの作成にも使えます。存在しないファイル名を指定すると、サイズ0のファイルが新規作成されます。
# 空ファイルを1つ作成する [pakira@Dolphin ~]$ touch newfile.txt [pakira@Dolphin ~]$ ls -l newfile.txt -rw-r--r-- 1 pakira pakira 0 Apr 4 09:20 newfile.txt # ↑サイズ0の空ファイルが作成されました。 # 複数ファイルを一度に作成することも可能 [pakira@Dolphin ~]$ touch file1.txt file2.txt file3.txt [pakira@Dolphin ~]$ ls -l file*.txt -rw-r--r-- 1 pakira pakira 0 Apr 4 09:21 file1.txt -rw-r--r-- 1 pakira pakira 0 Apr 4 09:21 file2.txt -rw-r--r-- 1 pakira pakira 0 Apr 4 09:21 file3.txt
応用・実務Tips
1. 文字列形式で日時を指定する(-d オプション)
GNU版の touch(Linux標準)は-d オプションで人間が読みやすい形式の日時文字列を受け付けます。-t の数値フォーマットより直感的に書けるのが特徴です。# ISO形式で指定 [pakira@Dolphin ~]$ touch -d "2024-01-01 00:00:00" du_file # 相対時間で指定(昨日) [pakira@Dolphin ~]$ touch -d yesterday du_file # 相対時間で指定(3日前) [pakira@Dolphin ~]$ touch -d "3 days ago" du_file # 来週月曜日 [pakira@Dolphin ~]$ touch -d "next monday" du_file [pakira@Dolphin ~]$ ls -l du_file -rw-r--r-- 1 pakira pakira 0 Jan 1 2024 du_file
-d オプションはGNU coreutilsの拡張機能です。macOSやBSD系のtouchでは使えません。サーバーではほぼ問題ありませんが、スクリプトの移植性を考えるなら
-t を使う方が安全です。2. atimeだけ・mtimeだけを変更する
・-a:atime(アクセス時刻)のみを変更・-m:mtime(修正時刻)のみを変更
デフォルトでは両方が更新されます。片方だけ変えたい場合に使います。
# mtimeだけを現在時刻に更新する(atimeは変えない) [pakira@Dolphin ~]$ touch -m du_file # atimeだけを指定日時に変更する [pakira@Dolphin ~]$ touch -a -t 202403150930 du_file # -t と組み合わせてmtimeだけ特定日時に変更する [pakira@Dolphin ~]$ touch -m -t 202403150930 du_file
3. シェルスクリプトでのロックファイル作成に活用する
スクリプトの二重起動防止にロックファイルを使うパターンはよく見ます。touch で作成、rm で削除するシンプルな実装です。
セミナーでも「cronジョブが重なって困った」という相談をよく受けますが、この方法でシンプルに防げます。
#!/bin/bash LOCKFILE="/tmp/myscript.lock" # ロックファイルが存在しなければ作成して処理を開始 if [ ! -f "$LOCKFILE" ]; then touch "$LOCKFILE" echo "処理を開始します" # ... 処理 ... rm -f "$LOCKFILE" else echo "既に処理が実行中です" exit 1 fi
4. findコマンドと組み合わせて複数ファイルのタイムスタンプを一括更新する
特定ディレクトリ配下のファイルをまとめて更新したい場合はfind と組み合わせます。# /home/pakira/backup 配下の .conf ファイルを全て現在時刻に更新 [pakira@Dolphin ~]$ find /home/pakira/backup -name "*.conf" -exec touch {} \; # 特定日付より古いファイルのタイムスタンプを更新する [pakira@Dolphin ~]$ find /var/www/html -name "*.html" -older /tmp/ref.txt -exec touch {} \; # 実行前に対象ファイルを確認したい場合(-exec の前に -print を入れる) [pakira@Dolphin ~]$ find /home/pakira/backup -name "*.conf" -print -exec touch {} \;
5. タイムスタンプを維持したままファイルをコピーする
ファイルのコピー時にタイムスタンプが変わってしまうのを防ぐにはcp -p を使います。ただし、すでにコピーしてしまった場合は touch で修正できます。
# タイムスタンプを保持してコピー(cp -p) [pakira@Dolphin ~]$ cp -p original.txt backup.txt # すでにコピーしてしまった場合、-r で元ファイルのタイムスタンプをコピーに設定 [pakira@Dolphin ~]$ touch -r original.txt backup.txt
-cオプション:ファイルが存在しない場合に新規作成しない
通常、存在しないファイルを指定すると touch は新規作成しますが、-c オプションを付けると作成しません。スクリプトで「存在するファイルだけタイムスタンプを更新したい」場面に使います。
# ファイルが存在する場合のみタイムスタンプを更新(存在しない場合は何もしない) [pakira@Dolphin ~]$ touch -c nonexistent.txt [pakira@Dolphin ~]$ ls -l nonexistent.txt ls: cannot access 'nonexistent.txt': No such file or directory # ↑ファイルは作成されていません。
トラブルシュート・エラー対処
「Operation not permitted」が出る場合
他のユーザーが所有するファイルのタイムスタンプを変更しようとするとエラーになります。[pakira@Dolphin ~]$ touch -t 202401010000 /var/log/messages touch: cannot touch '/var/log/messages': Operation not permitted # ↑rootが所有するファイルを一般ユーザーが変更しようとした場合のエラー
・自分が所有するファイルに対してのみ touch を実行する
・他ユーザーのファイルを変更する必要がある場合は
sudo を使う(sudoが許可されている場合のみ)# sudo を使って実行する [pakira@Dolphin ~]$ sudo touch -t 202401010000 /var/log/messages [pakira@Dolphin ~]$ ls -l /var/log/messages -rw------- 1 root root 123456 Jan 1 2024 /var/log/messages
chattr +i)が設定されたファイルは変更できません。# immutableフラグを確認する [root@Dolphin ~]# lsattr /etc/resolv.conf ----i--------e-- /etc/resolv.conf # ↑「i」フラグがあるとtouchでも変更不可 # immutableフラグを外す(必要な場合) [root@Dolphin ~]# chattr -i /etc/resolv.conf
「-t オプションで年を省略したら違う年になった」場合
-t オプションで年を省略すると、コマンドの実装によっては意図しない年が設定されることがあります。正確に指定したい場合は年4桁まで書くのが確実です。
# 省略形(意図しない年になる可能性がある) [pakira@Dolphin ~]$ touch -t 01011123 du_file [pakira@Dolphin ~]$ ls -l du_file -rw-r--r-- 1 pakira pakira 0 Jan 1 11:23 du_file # 表示年が省略されている場合、今年や来年に設定される可能性がある # 年まで明示するのが安全 [pakira@Dolphin ~]$ touch -t 202401011123 du_file [pakira@Dolphin ~]$ ls -l du_file -rw-r--r-- 1 pakira pakira 0 Jan 1 2024 du_file # ↑年が明示されて正しく設定されました。
「-d オプションが使えない」場合
macOSやFreeBSDなどのBSD系システムでは-d オプションが使えません。その場合は
-t オプションで代替します。# Linux(GNU touch)で使える形式 touch -d "2024-01-01 09:00:00" file.txt # macOS / BSD系でも使える形式(-t を使う) touch -t 202401010900 file.txt
「シンボリックリンクのタイムスタンプを変更したい」場合
通常、touchコマンドはシンボリックリンクをたどってリンク先のファイルを変更します。シンボリックリンク自体のタイムスタンプを変更したい場合は
-h または --no-dereference オプションを使います。# リンク先のファイルのタイムスタンプが変わる(デフォルト動作) [pakira@Dolphin ~]$ touch symlink.txt # シンボリックリンク自体のタイムスタンプを変更する [pakira@Dolphin ~]$ touch -h symlink.txt
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 任意の日時にタイムスタンプを変更する | touch -t CCYYMMDDhhmm ファイル名 |
| 別ファイルに日時を合わせる | touch -r 参照ファイル 対象ファイル |
| 文字列形式で日時を指定する | touch -d "2024-01-01 09:00:00" ファイル名 |
| 現在時刻に更新する | touch ファイル名 |
| 空ファイルを新規作成する | touch 新しいファイル名 |
| atimeのみを変更する | touch -a ファイル名 |
| mtimeのみを変更する | touch -m ファイル名 |
| ファイルが存在しない場合に作成しない | touch -c ファイル名 |
| シンボリックリンク自体を変更する | touch -h シンボリックリンク名 |
| 複数ファイルを一括更新する | find パス -name "*.conf" -exec touch {} \; |
-t・-r・-d の3オプションを押さえておけば、ほとんどの場面に対応できます。関連コマンドとして、findコマンドでファイルを検索する方法や、ファイルの一覧表示(ls)も合わせて確認しておくことをおすすめします。
touchコマンドを使いこなして、タイムスタンプ管理をスマートに
スクリプトでタイムスタンプを操作できると、バックアップ管理やデプロイ作業が一段とスムーズになります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます