今回はLinuxコマンドであるtouchコマンドについて解説します
touchコマンドは、空のファイルを作ったり、既存のファイルのタイムスタンプ(日時)を更新したりするコマンドです
動作確認用のファイルを用意するときや、findでの絞り込み・バックアップの判定など日時を使った作業でよく登場するので、ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
touchコマンドとは??
touchコマンドは、ファイルのアクセス日時と更新日時を変更するコマンドです
名前は英語の「touch(触れる)」のとおり、ファイルに軽く触れて日時だけを新しくするイメージです
指定したファイルが存在しないときは、中身が空(0バイト)のファイルを新しく作ります
そのため、実際の現場では「空のファイルを作るコマンド」として使われることも多いです
オプションを使うと、日時を現在ではなく好きな日時に変えたり、別のファイルと同じ日時にそろえたりできます
この記事の実行結果は、GNU coreutils 9.4のtouch(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています
touchコマンドの主なオプション
touchコマンドの主なオプションは次のとおりです
( )の中の長い名前のオプション(–no-createなど)はGNU版の書き方です
| オプション | 意味 |
|---|---|
| -a | アクセス日時(atime)だけを変更するオプション |
| -m | 更新日時(mtime)だけを変更するオプション |
| -c (–no-create) | ファイルが存在しないときに、新しいファイルを作らないオプション |
| -d (–date) | 現在の日時の代わりに、指定した日時に変更するオプション |
| -t | 日時を「[[CC]YY]MMDDhhmm[.ss]」という数字の並びで指定するオプション |
| -r (–reference) | 現在の日時の代わりに、指定したファイル(参照ファイル)と同じ日時にするオプション |
| -h (–no-dereference) | シンボリックリンクを指定したときに、リンク先のファイルではなくリンクそのものの日時を変更するオプション |
ここからは、テスト用のディレクトリtouch-testの中に練習用のファイルを作って説明します
次のコマンドで同じファイルを作れるので、一緒に試してみてください
mkdir△touch-test
cd△touch-test
# 日時を日本時間で扱う(この記事の実行結果と同じ表示にするため)
export△TZ=Asia/Tokyo
printf△”meeting△at△10:00\n”△>△memo.txt
printf△”date,sales\n2026-10-31,120000\n”△>△report.csv
printf△”2026-11-01△09:58:12△INFO△server△started\n2026-11-01△09:59:40△ERROR△disk△full\n”△>△app.log
touch△-d△”2026-11-01△10:00″△memo.txt△report.csv△app.log
# 作成したディレクトリの構成を確認する
ls△-l△–time-style=long-iso
実行結果:
total 12
-rw-rw-r– 1 user user 76 2026-11-01 10:00 app.log
-rw-rw-r– 1 user user 17 2026-11-01 10:00 memo.txt
-rw-rw-r– 1 user user 29 2026-11-01 10:00 report.csv
# ファイルの中身を確認する
cat△memo.txt
実行結果:
meeting at 10:00
cat△report.csv
実行結果:
date,sales
2026-10-31,120000
cat△app.log
実行結果:
2026-11-01 09:58:12 INFO server started
2026-11-01 09:59:40 ERROR disk full
以降のコマンドは、すべてtouch-testの中で実行します
export△TZ=Asia/Tokyoは、日時を日本時間で表示・指定するための設定です(日本語環境のサーバーでは最初から日本時間になっていることが多いですが、クラウドのサーバーなどはUTCのこともあります)
ls△-lに付けている–time-style=long-isoは、日時を「年-月-日 時:分」の形で表示するGNU版のオプションです(オプションなしだと、半年以上前の日時は時刻の代わりに年が表示されるなど、表示の形が変わるため)
-a
アクセス日時(atime)だけを変更するオプションです
-aだけだと現在の日時になるので、ここでは-dと組み合わせて日時を指定しています(–time=atimeと書いても同じ意味です)
# 事前準備:アクセス日時と更新日時をそろえる
touch△-d△”2026-11-01△10:00″△memo.txt
# 変更前の日時を確認する
stat△–printf△’atime:△%x\nmtime:△%y\n’△memo.txt
実行結果:
atime: 2026-11-01 10:00:00.000000000 +0900
mtime: 2026-11-01 10:00:00.000000000 +0900
# atimeはアクセス日時、mtimeは更新日時です
# アクセス日時だけを変更する
touch△-a△-d△”2026-11-05△09:00″△memo.txt
stat△–printf△’atime:△%x\nmtime:△%y\n’△memo.txt
実行結果:
atime: 2026-11-05 09:00:00.000000000 +0900
mtime: 2026-11-01 10:00:00.000000000 +0900
# atimeだけが変わり、mtime(更新日時)はそのままです
-m
更新日時(mtime)だけを変更するオプションです
ls△-lで表示される日時はこのmtimeなので、普段「ファイルの日付」と呼んでいるのはこちらです(–time=mtimeと書いても同じ意味です)
# 更新日時だけを変更する
touch△-m△-d△”2026-11-06△18:30″△memo.txt
stat△–printf△’atime:△%x\nmtime:△%y\n’△memo.txt
実行結果:
atime: 2026-11-05 09:00:00.000000000 +0900
mtime: 2026-11-06 18:30:00.000000000 +0900
# 今度はmtimeだけが変わり、atimeは-aで変えた日時のままです
-c (–no-create)
ファイルが存在しないときに、新しいファイルを作らないオプションです
既存のファイルの日時だけを更新したいときに付けると、ファイル名を打ち間違えても余計な空ファイルができません
# 存在しないファイルに-cを付けて実行する
touch△-c△nofile.txt
ls△nofile.txt
実行結果:
ls: cannot access ‘nofile.txt’: No such file or directory
# エラーにならず、ファイルも作られません
# 存在するファイルなら、日時は更新される
touch△-c△-d△”2026-11-02△08:00″△report.csv
ls△-l△–time-style=long-iso△report.csv
実行結果:
-rw-rw-r– 1 user user 29 2026-11-02 08:00 report.csv
-d (–date)
現在の日時の代わりに、指定した日時に変更するオプションです
「2026-11-01△10:00」のような形で書けて、秒まで指定することもできます
「yesterday」「3△days△ago」のような自由な書き方ができるのはGNU版だけです(POSIXの規格では「2026-11-01T10:00:00」のような形だけが決められています)
# 日時を指定してファイルを作る
touch△-d△”2026-10-31△23:59:30″△new.txt
stat△-c△’%y△%n’△new.txt
実行結果:
2026-10-31 23:59:30.000000000 +0900 new.txt
# ファイルが存在しない場合は、指定した日時の空ファイルが作られます
# 「3日前」のように、今からの相対的な日時で指定する(GNU版)
touch△-d△”3△days△ago”△old.txt
find△.△-name△old.txt△-mtime△+2
実行結果:
./old.txt
# 日時は実行した日によって変わるので、findで「更新日時が3日以上前」になっていることを確認しています
# 練習用のファイルを削除する
rm△new.txt△old.txt
-t
日時を「[[CC]YY]MMDDhhmm[.ss]」という数字の並びで指定するオプションです
西暦(CCYY)と秒(.ss)は省略でき、MMDDhhmm(月日時分)は必ず書きます
-dと違って書き方が1つに決まっているので、どのLinuxやUNIXでも同じように使えます
# 2026年11月1日10時30分に変更する
touch△-t△202611011030△report.csv
stat△-c△’%y△%n’△report.csv
実行結果:
2026-11-01 10:30:00.000000000 +0900 report.csv
# 秒まで指定する(.の後ろが秒)
touch△-t△202611011030.45△report.csv
stat△-c△’%y△%n’△report.csv
実行結果:
2026-11-01 10:30:45.000000000 +0900 report.csv
-r (–reference)
現在の日時の代わりに、指定したファイル(参照ファイル)と同じ日時にするオプションです
アクセス日時と更新日時の両方が、参照ファイルと同じになります
# 変更前の日時を確認する
stat△-c△’%y△%n’△memo.txt△app.log
実行結果:
2026-11-06 18:30:00.000000000 +0900 memo.txt
2026-11-01 10:00:00.000000000 +0900 app.log
# app.logの日時をmemo.txtと同じにする
touch△-r△memo.txt△app.log
stat△-c△’%y△%n’△memo.txt△app.log
実行結果:
2026-11-06 18:30:00.000000000 +0900 memo.txt
2026-11-06 18:30:00.000000000 +0900 app.log
-h (–no-dereference)
シンボリックリンクを指定したときに、リンク先のファイルではなくリンクそのものの日時を変更するオプションです
-hなしでは、リンク先のファイルの日時が変わります(-hはPOSIXの規格にはないオプションで、GNU版やBSD版で使えます)
# 事前準備:memo.txtへのシンボリックリンクを作る
ln△-s△memo.txt△memo-link
# -hを付けて、リンクそのものの日時を変更する
touch△-h△-d△”2026-10-01△08:00″△memo-link
ls△-l△–time-style=long-iso△memo.txt△memo-link
実行結果:
lrwxrwxrwx 1 user user 8 2026-10-01 08:00 memo-link -> memo.txt
-rw-rw-r– 1 user user 17 2026-11-06 18:30 memo.txt
# memo-linkの日時だけが変わり、リンク先のmemo.txtはそのままです
# -hなしの場合は、リンク先のファイルの日時が変わる
touch△-d△”2026-10-02△08:00″△memo-link
ls△-l△–time-style=long-iso△memo.txt△memo-link
実行結果:
lrwxrwxrwx 1 user user 8 2026-10-01 08:00 memo-link -> memo.txt
-rw-rw-r– 1 user user 17 2026-10-02 08:00 memo.txt
# 練習用のリンクを削除する
rm△memo-link
基本的な使い方
touchコマンドの基本的な構文は「touch△オプション△ファイル名」です
ファイル名を空白で区切って並べると、複数のファイルをまとめて処理できます
オプションなしで実行すると、ファイルがなければ空のファイルを作り、ファイルがあれば日時を現在の日時に更新します
# 空のファイルを作る
touch△empty.txt
wc△-c△empty.txt
実行結果:
0 empty.txt
# サイズが0バイトのファイルができています
# 複数のファイルをまとめて作る
touch△a.txt△b.txt△c.txt
ls
実行結果:
a.txt app.log b.txt c.txt empty.txt memo.txt report.csv
# 既存のファイルの日時を現在の日時に更新する
touch△app.log
ls△-t△app.log△memo.txt△report.csv
実行結果:
app.log report.csv memo.txt
# ls -tは新しい順に並べるので、更新したapp.logが先頭になります
# 中身は変わらず、日時だけが新しくなります
cat△app.log
実行結果:
2026-11-01 09:58:12 INFO server started
2026-11-01 09:59:40 ERROR disk full
# 練習用のファイルを削除する
rm△empty.txt△a.txt△b.txt△c.txt
現在の日時に更新した結果は実行した日時によって変わるので、この記事ではls△-t(新しい順の並び)で確認しています
atime・mtime・ctimeの違い
Linuxのファイルには、主に次の3つの日時が記録されています
・atime(Access time):最後にファイルの中身を読んだ日時
・mtime(Modify time):最後にファイルの中身を書き換えた日時(ls△-lで表示される日時)
・ctime(Change time):最後にファイルの中身や属性(権限・所有者・日時など)が変わった日時
touchで変更できるのはatimeとmtimeだけで、ctimeは変更できません
touchで日時を変えること自体が「属性の変更」なので、ctimeはtouchを実行した日時になります
# 事前準備:memo.txtの日時をそろえる
touch△-d△”2026-11-01△10:00″△memo.txt
# statで3つの日時を表示する
stat△–printf△’atime:△%x\nmtime:△%y\nctime:△%z\n’△memo.txt
実行結果:
atime: 2026-11-01 10:00:00.000000000 +0900
mtime: 2026-11-01 10:00:00.000000000 +0900
ctime: 2026-11-03 01:01:33.179147359 +0900
# ctimeは実行した日時になるので、表示される日時は環境によって違います
# ls -luでatimeを、ls -lcでctimeを表示できる
touch△-a△-d△”2026-11-03△12:00″△memo.txt
ls△-l△–time-style=long-iso△memo.txt
実行結果:
-rw-rw-r– 1 user user 17 2026-11-01 10:00 memo.txt
ls△-lu△–time-style=long-iso△memo.txt
実行結果:
-rw-rw-r– 1 user user 17 2026-11-03 12:00 memo.txt
# ls -lはmtime、ls -luはatimeを表示しています
catなどでファイルを読むとatimeが更新されますが、最近のLinuxは「relatime」という設定で、atimeの更新を1日1回程度に減らしていることが多いです
そのため、atimeは「最後に読んだ日時の目安」くらいに考えておくのがおすすめです
タイムゾーンに注意する
-dや-tで指定した日時や、ls・statで表示される日時は、環境変数TZ(タイムゾーン)の設定に合わせて扱われます
同じファイルでも、タイムゾーンが違うと表示される時刻が変わるので注意しましょう
# 今のタイムゾーンを確認する
echo△$TZ
実行結果:
Asia/Tokyo
# 日本時間とUTCで、同じファイルの更新日時を表示する
stat△-c△’%y△%n’△memo.txt
実行結果:
2026-11-01 10:00:00.000000000 +0900 memo.txt
TZ=UTC△stat△-c△’%y△%n’△memo.txt
実行結果:
2026-11-01 01:00:00.000000000 +0000 memo.txt
# 同じ日時でも、UTCでは9時間前の時刻として表示されます
# タイムゾーンを付けて日時を指定する(GNU版)
touch△-d△”2026-11-01△10:00△UTC”△utc.txt
stat△-c△’%y△%n’△utc.txt
実行結果:
2026-11-01 19:00:00.000000000 +0900 utc.txt
# UTCの10時は、日本時間では19時です
rm△utc.txt
サーバーのタイムゾーンは、timedatectlコマンドや/etc/localtimeで確認できます(結果は環境によって違うので省略しています)
touchコマンドの実践的な活用例
実際の現場でよく使われるtouchコマンドの活用例をご紹介します
ファイルの日付をそろえる
cpでコピーしたファイルは、日時がコピーした日時になります
-rを使うと、コピー元と同じ日時にそろえられます(cp△-pでコピーするときに日時を保つこともできます)
# 事前準備:report.csvをコピーする
cp△report.csv△report_copy.csv
# コピー元の日時をコピー先にそろえる
touch△-r△report.csv△report_copy.csv
ls△-l△–time-style=long-iso△report.csv△report_copy.csv
実行結果:
-rw-rw-r– 1 user user 29 2026-11-01 10:30 report.csv
-rw-rw-r– 1 user user 29 2026-11-01 10:30 report_copy.csv
# 練習用のファイルを削除する
rm△report_copy.csv
ブレース展開で複数のファイルを一度に作る
{1..3}や{jan,feb,mar}のように書くと、bashが複数のファイル名に展開してからtouchに渡します
これはtouchの機能ではなくbashなどのシェルの機能(ブレース展開)なので、ほかのコマンドでも使えます
# 連番のファイルを作る
touch△log_{01..03}.txt
# 名前を並べてファイルを作る
touch△sales_{jan,feb,mar}.csv
ls
実行結果:
app.log log_02.txt memo.txt sales_feb.csv sales_mar.csv
log_01.txt log_03.txt report.csv sales_jan.csv
# どう展開されるかは、echoで確認できる
echo△touch△log_{01..03}.txt
実行結果:
touch log_01.txt log_02.txt log_03.txt
# 練習用のファイルを削除する
rm△log_{01..03}.txt△sales_{jan,feb,mar}.csv
findのテスト用に古いファイルを作る
「7日より前のログを探す」ようなfindコマンドを試したいとき、本当に古いファイルを用意するのは大変です
touch△-dでわざと古い日時のファイルを作ると、すぐにテストできます
# 事前準備:日時の違うログファイルを作る
mkdir△logs
touch△-d△”10△days△ago”△logs/old1.log△logs/old2.log
touch△-d△”2△days△ago”△logs/recent.log
# 更新日時が8日以上前のファイルを探す
find△logs△-name△”*.log”△-mtime△+7△|△sort
実行結果:
logs/old1.log
logs/old2.log
# 更新日時が1日以内のファイルを探す
touch△logs/today.log
find△logs△-name△”*.log”△-mtime△-1
実行結果:
logs/today.log
# 基準のファイルより新しいファイルを探す
touch△-d△”5△days△ago”△logs/.stamp
find△logs△-name△”*.log”△-newer△logs/.stamp△|△sort
実行結果:
logs/recent.log
logs/today.log
# 練習用のディレクトリを削除する
rm△-r△logs
# ※rm -rはディレクトリを中身ごと削除します。必ずテスト用ディレクトリの中で試してください
-mtime△+7は「更新日時が8日以上前(24時間単位で切り捨てて7日より前)」、-mtime△-1は「24時間以内」という意味です
バックアップの判定用に目印ファイルを使う
バックアップを取った時点でtouchで目印のファイルを作っておくと、find△-newerで「前回のバックアップ以降に変わったファイル」だけを探せます
ここでは、実行日によって結果が変わらないように、目印もファイルの更新も日時を指定して再現しています
# 事前準備:ファイルの日時をそろえる
touch△-d△”2026-11-01△10:00″△memo.txt△report.csv△app.log
# 2026-11-01 12:00にバックアップを取った目印を作る
touch△-d△”2026-11-01△12:00″△.last_backup
# その後memo.txtが更新されたことにする
touch△-d△”2026-11-01△15:00″△memo.txt
# 目印より新しいファイル(バックアップが必要なファイル)を探す
find△.△-maxdepth△1△-type△f△-newer△.last_backup
実行結果:
./memo.txt
# バックアップが終わったら、目印を現在の日時に更新する
touch△.last_backup
find△.△-maxdepth△1△-type△f△-newer△.last_backup
# 目印より新しいファイルがなくなったので、何も表示されません
# 練習用の目印を削除する
rm△.last_backup
makeで作り直しをさせる
makeコマンドは、元のファイルが作ったファイルより新しいかどうかを更新日時で比べて、必要なときだけ作り直します
元のファイルの中身を変えなくても、touchで日時を新しくすれば作り直しをさせられます
# 事前準備:in.txtをコピーしてout.txtを作るMakefileを用意する
printf△”data\n”△>△in.txt
printf△”out.txt:△in.txt\n\tcp△in.txt△out.txt\n”△>△Makefile
cat△Makefile
実行結果:
out.txt: in.txt
cp in.txt out.txt
# 2行目の先頭の空白は、タブ文字です
# 1回目はout.txtがないので作られる
make
実行結果:
cp in.txt out.txt
# 2回目はout.txtのほうが新しいので何もしない
make
実行結果:
make: ‘out.txt’ is up to date.
# in.txtをtouchで更新してから、もう一度makeする
touch△in.txt
make
実行結果:
cp in.txt out.txt
# in.txtのほうが新しくなったので、もう一度作り直されます
# 練習用のファイルを削除する
rm△Makefile△in.txt△out.txt
makeを実行できない場合は、build-essentialなどのパッケージでmakeをインストールしてください
トラブルシューティング
touchコマンドを使うときによくあるつまずきと、その解決方法です
エラーメッセージは、引用符がそろった英語の表示にするためにLC_ALL=Cを付けて実行しています(日本語の環境では日本語で表示されます)
「No such file or directory」でファイルが作れない
touchはファイルを作れますが、途中のディレクトリまでは作ってくれません
存在しないディレクトリの中にファイルを作ろうとすると、このエラーになります
# 存在しないディレクトリの中にファイルを作ろうとする
LC_ALL=C△touch△nodir/a.txt
実行結果:
touch: cannot touch ‘nodir/a.txt’: No such file or directory
# 先にmkdir -pでディレクトリを作ってからtouchする
mkdir△-p△nodir△&&△touch△nodir/a.txt
ls△nodir
実行結果:
a.txt
# 練習用のディレクトリを削除する
rm△-r△nodir
「Permission denied」でファイルが作れない
ファイルを作るには、そのディレクトリへの書き込み権限が必要です
書き込み権限のないディレクトリの中にファイルを作ろうとすると、このエラーになります
# 事前準備:書き込み権限のないディレクトリを作る
mkdir△locked
chmod△555△locked
# 書き込み権限のないディレクトリの中にファイルを作ろうとする
LC_ALL=C△touch△locked/a.txt
実行結果:
touch: cannot touch ‘locked/a.txt’: Permission denied
# 権限を元に戻してから、練習用のディレクトリを削除する
chmod△775△locked
rmdir△locked
自分の権限で解決できない場所(/etcなど)では、sudoが必要かどうか、その場所に本当にファイルを作ってよいかを確認してから実行しましょう
ファイルが作られない(-cを付けている)
-c(–no-create)を付けていると、存在しないファイルは作られず、エラーも表示されません
スクリプトやエイリアスで-cを付けていないか確認しましょう(-hを付けた場合も、ファイルは作られません)
touch△-c△memo2.txt
echo△$?
実行結果:
0
# 終了ステータスは0(成功)なので、エラーにも気づきにくいです
ls△memo2.txt
実行結果:
ls: cannot access ‘memo2.txt’: No such file or directory
# -cを外すと作られる
touch△memo2.txt
ls△memo2.txt
実行結果:
memo2.txt
rm△memo2.txt
「invalid date format」が出る
-dや-tで指定した日時の書き方が間違っていると、このエラーになります
特に-tは「MMDDhhmm」(月日時分)を必ず書く決まりなので、桁が足りないとエラーになります
# 存在しない月(13月)を指定した
LC_ALL=C△touch△-d△”2026-13-01″△memo.txt
実行結果:
touch: invalid date format ‘2026-13-01’
# -tに分(mm)を書き忘れた
LC_ALL=C△touch△-t△2026110110△memo.txt
実行結果:
touch: invalid date format ‘2026110110’
# -tに-dの書き方をしてしまった
LC_ALL=C△touch△-t△”2026-11-01△10:00″△memo.txt
実行結果:
touch: invalid date format ‘2026-11-01 10:00’
# 正しい書き方
touch△-t△202611011000△memo.txt
stat△-c△’%y△%n’△memo.txt
実行結果:
2026-11-01 10:00:00.000000000 +0900 memo.txt
また、-dで「01/11/2026」のようにスラッシュで書くと「月/日/年」として扱われるので、日本の「年/月/日」や「日/月/年」のつもりで書くと別の日付になってしまいます
touch△-d△”01/11/2026″△slash.txt
stat△-c△’%y△%n’△slash.txt
実行結果:
2026-01-11 00:00:00.000000000 +0900 slash.txt
# 11月1日のつもりでも、1月11日になります
rm△slash.txt
# 日付は「2026-11-01」のようにハイフンで書くと間違えにくいです
まとめ
いかがでしたでしょうか
今回はtouchコマンドについてまとめてみました
touchは、空のファイルを作るだけでなく、-dや-tで好きな日時に変えたり、-rで別のファイルと日時をそろえたりできるコマンドです
-aでatime、-mでmtimeだけを変えられ、ctimeはtouchを実行した日時になることも覚えておきましょう
findやmakeと組み合わせると、日時を使ったテストやバックアップの判定がぐっと楽になります
ぜひマスターしてください!
