Linux / コマンド / touch - ファイル作成とタイムスタンプの変更
touchは、ファイルが存在しない場合は空のファイルを作成し、ファイルがある場合はアクセス時刻と修正時刻を更新するコマンドです。ファイルの内容を変更せずにタイムスタンプだけを調整できるため、テストファイルの作成、ビルド作業や自動化スクリプトでよく使用されます。
この記事では、GNU Coreutilsのtouchを基に、基本的な使い方、アクセス時刻(atime)と内容の変更時刻(mtime)の選択、希望する日付の指定、基準ファイルの時間コピーおよびシンボリックリンクの扱い方法を説明します。
touchコマンドとは?
touchは、指定したファイルのアクセス時刻(access time)と内容修正時刻(modification time)を基本的に現在時刻に設定します。ファイルが存在しない場合はサイズ0バイトの通常ファイルを新規作成しますが、-cを使用すると新しいファイルは作成されません。ctimeやファイル作成時刻(Birth time)を希望する値に直接設定するコマンドではありません。
基本的な文法
touch [オプション] ファイル ...
ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、touch --helpとman touchで現在のシステムの説明を確認してください。
touchの基本的な使い方
空のファイルを作る
存在しないパスを指定すると空のファイルが作成されます。複数のファイルも一度に作成可能です。
touch memo.txt
touch file1.txt file2.txt file3.txt
touch "annual report.txt"
既存ファイルの日時を現在に更新する
ファイルが既に存在する場合、内容とサイズは維持され、アクセス日時と修正日時が現在の時刻に更新されます。変更前後の値はstatコマンドで確認できます。notes.txt は既存ファイルの例なので、比較前に練習用のファイルを用意してください。
stat notes.txt
touch notes.txt
stat notes.txt
ファイルがないときは作らない
既存ファイルの日時だけを更新する場合は-cまたは--no-createを使用します。対象がなくても新しいファイルは作成されず、通常エラーメッセージも出力されません。
touch -c existing.txt
実行結果を確認する
touchは成功しても通常画面に何も出力しません。新しく作ったファイルのサイズが0バイトかどうかを確認するには、次のように確認します。
touch empty-demo.txt
stat -c '%s %n' empty-demo.txt
例の出力:
0 empty-demo.txt
既存のファイルに同じコマンドを実行した場合は、サイズと内容はそのままで、アクセス・修正時刻のみが更新されることがあります。その差はstat -c '%x %y'で確認してください。
主なオプション
| オプション | 説明 |
|---|---|
-a |
アクセス時刻のみ変更します。 |
-m |
内容修正時刻のみ変更します。 |
-c, --no-create |
対象ファイルがなくても新しいファイルは作成しません。 |
-d STRING |
人が読みやすい日付文字列を解釈して時間を設定します。 |
-t STAMP |
[[CC]YY]MMDDhhmm[.ss] 形式で時間を指定します。 |
-r FILE |
基準ファイルのアクセス・修正時刻をコピーします。 |
-h, --no-dereference |
可能なシステムではリンク先ではなく、シンボリックリンク自体の時間を変更します。 |
--time=WORD |
access または modify のように変更する時間を選択します。 |
長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。
実践的活用例
アクセス時刻と修正時刻を別々に変更する
-a は atime のみ、-m は mtime のみ変更します。両方のオプションを併用すると、デフォルト動作のように両方の時間を変更します。
touch -a access-log.txt
touch -m generated.css
希望する日付と時刻を指定する
-dは日付文字列を解析します。タイムゾーンや相対表現は実行環境によって解析結果が異なる可能性があるため、自動化では明確な形式とタイムゾーンを使用する方が安全です。以下の1行目は +0900 を明示していますが、2行目の -t は TZ 環境変数またはシステムのタイムゾーンに従うため、必ずしも同じ瞬間にはなりません。
touch -d '2026-09-23 14:30:00 +0900' report.txt
touch -t 202609231430.00 report.txt
基準ファイルのタイムスタンプをコピーする
-rを使用すると、基準ファイルのatimeとmtimeを他のファイルに適用できます。reference.txt は実在する基準ファイルに置き換え、コピーした後に stat で結果を検証してください。
touch -r reference.txt target.txt
stat reference.txt target.txt
touchと関連するコマンドの比較
| コマンド・方法 | 主な役割 | 適した状況 |
|---|---|---|
touch |
空のファイルを作成するか、atime・mtimeを変更する | 内容を書かずにファイルや時間を準備する場合 |
truncate |
ファイルサイズを指定または調整する | 0バイトファイルまたは特定のサイズのファイルが必要なとき |
date |
現在時刻の表示・変換およびシステム時刻の管理 | 日付計算や形式変換が必要なとき |
stat |
ファイルメタデータの参照 | 変更前後のタイムスタンプを確認するとき |
使用する際の注意点
新しいファイルの作成には親ディレクトリへの書き込み・検索権限が必要です。既存ファイルを現在時刻に合わせる場合は通常、所有者であるか書き込み権限が必要で、任意の時刻の指定は所有者または適切な権限を持つプロセスに限られます。練習には自分が所有する作業用ファイルを使ってください。-h は新しいファイルを作成せず、リンク時刻を変更できるかはシステムにも依存します。
touchは内容を消さない
既存ファイルにtouchを実行してもファイル内容は保持されます。ファイルを0バイトに縮小するにはtruncate -s 0や適切なリダイレクションを使用する必要があります。
ctimeと作成時刻は直接指定できない
ファイルのinode状態が変わると、ctimeはカーネルによって更新されます。touchでctimeやBirth timeを任意の値に設定できると考えないでください。
依存関係の問題を隠すために時刻を操作しない
タイムスタンプベースのビルドツールで強制的に再ビルドする時に便利ですが、依存関係の問題を隠す目的で使うと、再現が難しい結果が生じることがあります。
FAQ
touchで既存のファイル内容は削除されますか?
いいえ。既存のファイルの内容とサイズは保持され、選択したタイムスタンプだけが変更されます。
ファイルがないときに作らないようにするにはどうすればいいですか?
touch -c ファイルを使用します。対象がなければ新しいファイルは作成されません。
修正時刻だけを変更するにはどうすればいいですか?
touch -m ファイルを使用します。アクセス時間だけを変更したい場合は-aを使用してください。
他のファイルと同じ時間に合わせることはできますか?
touch -r 基準ファイル 対象ファイルを使用すると、基準ファイルのアクセス・修正時間をコピーすることができます。




