Touch (UNIX)

touchは、標準的なUnixのプログラムであり、ファイルの最終アクセス時刻と最終変更時刻を変えるために使用される。また、新規の空ファイルを作成するためにも使用される。

歴史 
touchユーティリティはVersion 7 AT&T UNIXにおいて最初にリリースされた。GNU Core Utilitiesにバンドルされているtouchのバージョンは、ポール・ルビン、アーノルド・ロビンズ、ジム・キングドン、デビッド・マッケンジーおよびスニル・シャーマによって作成された。

仕様 
Single UNIX Specification（SUS）において、touchはファイルの最終アクセス時刻または最終変更時刻またはその両方を変えるものであると定義されている。ファイルは引数のパス名で指定される。指定したファイルが存在しない場合は、ファイルを新規に作成して、最終アクセス時刻と最終変更時刻を指定した時刻に設定する。時刻を指定しない場合には、touchは現在時刻を使用する。

使用法 
SUSにおいて、次のようなオプションが指定されている：
 -a、最終アクセス時刻のみを変更
 -c、ファイルが存在しない場合でも、新規に作成せず、状況を報告しない
 -m、最終変更時刻のみを変更
 -r file、fileと同じ最終アクセス時刻と最終変更時刻を使用
 -t time、以下に記載するようなフォーマットで指定した最終アクセス時刻と最終変更時刻を使用

時刻は[[cc]yy]MMDDhhmm[.ss]というフォーマットで指定される。ここで、MMは月を示す2桁の数字、DDは日を示す2桁の数字、hhは時間を示す2桁の数字、mmは分を示す2桁の数字である。オプションのssは秒を示す2桁の数字、ccは西暦の上2桁を示す数字、yyは西暦の下2桁を示す数字である。

オプションで引数に時刻を指定しない場合は、最終アクセス時刻と最終変更時刻として現在の日付と時刻を使用する。この仕様は、ファイルの内容を変更せずに、ファイルの最終アクセス時刻と最終変更時刻を最新にすることに相当する。この動作は、ある種の状況の下では（以下の例に示すように）望ましい仕様と考えられる。

他のUNIXおよびUnix系のオペレーティングシステムにおいては、これ以外のオプションを追加している。例えば、GNU touchは、-dというオプションを追加している。このオプションは、上記のオプションで指定する以外のフォーマットで時刻を指定する。

例 
touchの最も簡単なユースケースは
 # touch myfile.txt
である。この例では、touchはmyfile.txtの内容を変更せずに、myfile.txtのタイムスタンプのみをコンピューターの現在の日付と時刻に更新する。

次の例は、なぜこのような動作が望ましいのか示す。一般に、作成中のソフトウェアプロジェクトではプログラムをmakeコマンドでビルドすることが多い。その際に、makefileを変更して、makeコマンドで再ビルドする必要があると仮定する。しかし、作業の直後にmakeが以下のような報告をすることがある：
 # make
 make: nothing to be done for `all'

これはソースコードファイルが（ターゲットより以前に）更新されていたからで、touchコマンドでファイルの更新をシミュレートする必要がある。そのようにすると、以下のようにmakeを走らせて、プログラムをリコンパイルできるようになる：
 # touch project.c
 # make

以下の例は、ファイルの日付と時刻を変更する方法を示す：

 # touch -t 200701310846.26 index.html
 # touch -d '2007-01-31 8:46:26' index.html
 # touch -d 'Jan 31 2007 8:46:26' index.html
 #
   （* Win32(XP)コマンドプロンプトの場合は、シングルクォート(')の
      代りにダブルクォート(")を使用せよ。
      そうしないと、"touch: Invalid date format"というエラーが
      発生するであろう。）

上記の3つの例は同値である。すなわち、index.htmlの日付と時刻を2007年1月31日の午前8時46分26秒に設定する。

cp, grep, chmodなどのコマンドとは異なり、touchはコマンドを再帰的にサブディレクトリに適用する再帰的なスイッチ（-r または -R または両方）を持っていない（2008年8月時点）。しかし、以下のようにすれば適用できる：

 # find . -exec touch {} \;

この方法は比較的、実行速度が遅い。これは以下のようにすれば高速化できる：

 # find . | xargs touch

ファイル名またはサブディレクトリ名に空白が含まれる場合は、以下のようにするとよい：

 # find . -print0 | xargs -0 touch

他のオペレーティングシステム 
touchユーティリティと似た動作をおこなうプログラムが、Microsoft WindowsやMac OSなどの他のオペレーティングシステムでも使用可能となっている。

関連項目
システム時刻

外部リンク
 Single Unix Specificationで指定されるtouchの仕様（英語）
 ntouch/dtouchのページ（英語）
 touchの使い方を示す例（英語）

マニュアル 
 touch — GNU coreutilsのマニュアル（英語）
 touch — OpenBSDのマニュアル（英語）
 Manpage of TOUCH JM Project
 touch(1) man page（SunOS リファレンスマニュアル）
 touch(1) man page（HP-UX リファレンス）

標準UNIXプログラム