[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.4 touch: ファイルのタイムスタンプを変更する

touch は指定されたファイルのアクセス日時 (access time) や更新日時 (modification time) を変更する。

書式:

 
touch [option]… file

引数 file に存在しないファイルを指定すると、空のファイルが作成される。 ただし、‘--no-create’ (‘-c’) や ‘--no-dereference’ (‘-h’) が有効な場合は、ファイルは作成されない。

引数 file が ‘-’ という文字列の場合は、特別な扱いをする。touch は、標準出力に結びついているファイルの日時を変更するのである。

touch は、デフォルトではファイルのタイムスタンプを現在の日時にセットする。 touch はオペランドを左から右へと順番に処理するので、 生成されたタイムスタンプが、前後のオペランドで一致しないこともある。 また、「現在」とはいつかを決めるのは、プラットフォーム次第である。 ネットワーク・ファイルシステムを使用しているプラットフォームでは、 オペレーティング・システムとファイルシステムとで別のクロックを使用していることも珍しくない。 touch は通常、デフォルトではファイルシステムのクロックを使用するので、 クロックのずれのために、生成されたファイルのタイムスタンプが、 あるプログラムにとっては「未来」に見えたり、「過去」に見えたりすることがある。

touch コマンドは、ファイルのタイムスタンプを、 ユーザが指定した日時よりも精度が高くならない範囲で、表現できる最も精密な値にセットする。 この値がユーザが指定した日時と違うことがあるが、それにはいくつかの理由がある。 第一に、ユーザが指定した日時が、サポートされている精度を越えていることがある。 第二に、ファイルシステムが、日時のタイプによって別の精度を使っていることがある。 第三に、ファイルのタイムスタンプが、オペレーティング・システムのタイムスタンプとは別の精度を使っていることがある。 第四に、オペレーティング・システムでタイムスタンプの更新に使用される基本データ型が、 さらに違う精度を採用していることがある。そんなわけで、理屈の上では、 たとえば、ファイルシステムでは、アクセス日時には 10 マイクロ秒の精度を、更新日時には 100 ナノ秒の精度を使用し、オペレーティング・システムの方では、現在の時刻にはナノ秒の精度を、 touch がファイルのタイムスタンプを任意の値に設定するために使う基本データ型には、 マイクロ秒の精度を使用している、そういうこともありえるのである。

タイムスタンプを現在の時刻にセットする場合には、 ユーザが所有していないファイルでも、書き込み権限さえ持っていれば、touch はそのタイムスタンプを変更することができる。 しかし、現在の時刻以外にセットするには、ユーザはそのファイルを所有していなければならない。 古いシステムの中には、制限がさらに厳しいものもある。 たとえば、アクセス日時と更新日時の両方を現在の時刻にセットするとき以外、 対象となるファイルを所有していなければならないといった具合だ。

touch が提供するオプションを使えば、ファイルの 2 種類の日時 — 最終アクセス日時と最終更新日時 — を変更することができるが、 標準の日時には、実はそのほかに 3 番目のものがある。すなわち、inode の変更日時 (inode change time) だ。これは、ファイルの ctime と呼ばれることが多い。 inode の変更日時は、ファイルのメタ情報が最後に変更された日時を表している。 メタ情報の変更のよくある例の一つは、ファイルのアクセス権の変更である。 アクセス権の変更では、ファイルにアクセスするわけではないので、atime (アクセス日時) は変化しないし、またファイルの内容を変更するわけでもないので、mtime (更新日時) も変化しない。しかし、ファイルそのものに関する何ものかが変化しているわけであり、 それはどこかに記録されなければならない。まさにそれが、inode の ctime フィールドの役割なのだ。 たとえば、バックアップ・プログラムが、ファイルのアクセス権に変更があった場合も含めて、 ファイルのコピーを最新に保つことができるようにするには、ctime が不可欠である。 ファイルの ctime は変更するが、他の日時には影響を及ぼさない別の操作には、ファイル名の変更がある。 なお、いかなる場合であれ、通常の操作では、ユーザが ctime フィールドを自分で指定する値に変更することはできない。 オペレーティングシステムやファイルシステムの中には、4 番目の日時をサポートしているものもある。 すなわち、作成日時 (birth time) であり、ファイルが最初に作られた日時だ。 名前からして当然だが、このタイムスタンプが変更されることはない。

タイムスタンプは、タイムゾーンのルールに従うが、そのルールを指定しているのは、環境変数 TZ である。 TZ が設定されていない場合は、システムのデフォルトのルールに従う。 See (libc)TZ Variable section ‘Specifying the Time Zone with TZ’ in The GNU C Library Reference Manual. なお、UTC のタイムスタンプを使えば、夏 (冬) 時間への移行時の曖昧さを避けることができる。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-a
--time=atime
--time=access
--time=use

アクセス日時のみ変更する。

-c
--no-create

存在しないファイルについて警告を出さず、ファイルの作成もしない。

-d time
--date=time

現在の日時の代わりに time を使用する。time には、月の名前、 タイムゾーン、‘am’ や ‘pm’、‘yesterday’ なども使うことができる。 たとえば、‘--date="2004-02-27 14:19:13.489392193 +0530"’ とすると、 UTC より 5 時間 30 分東のタイムゾーンで、2004 年 2 月 27 日 午後 2 時 19 分 13 秒 から 489,392,193 ナノ秒経過した瞬間を指定することになる。 See section 日付入力の書式. 精度の高いタイムスタンプをサポートしていないファイルシステムでは、 精度の超過分は単に無視される。

-f

何もしない。BSD 版の touch との互換性のためにある。

-h
--no-dereference

シンボリックリンクが参照しているファイルではなく、シンボリックリンクのタイムスタンプの変更を試みる。 このオプションを使用した場合、空のファイルは作成されないが、 ファイルが存在しないという警告まで出ないようにするには、‘-c’ オプションも併せて使用する必要がある。 すべてのシステムが、シンボリックリンクのタイムスタンプの変更をサポートしているわけではない。 なぜならば、POSIX 2008 までは、下層で動いているシステムに対して、 そうした動作のサポートを要求していなかったからだ。 また、システムによっては、シンボリックリンクは、調べるだけでアクセス日時が変わってしまうので、 変更の結果が後々まで残って観察できるのは、更新日時だけだというものもある。 なお、このオプションを ‘-r’ オプションと一緒に使用すると、 参照するタイムスタンプが、リンクが指しているファイルからではなく、 シンボリックリンクから取得される。

-m
--time=mtime
--time=modify

更新日時 (modification time) のみ変更する。

-r file
--reference=file

現在の日時の代わりに、参照ファイル file の日時を使用する。 このオプションを ‘--date=time’ (‘-d time’) オプションと組み合わせて使うと、time が相対時間で指定されている場合は、参照ファイル file の日時がその基点となるが、それ以外の場合は、file の日時は無視される。 たとえば、‘-r foo -d '-5 seconds'’ は、‘foo’ のタイムスタンプより 5 秒前のタイムスタンプを指定している。 file がシンボリックリンクの場合は、‘-h’ が同時に有効になっていないかぎり、 参照するタイムスタンプは、シンボリックリンクの参照先から取得される。

-t [[cc]yy]mmddhhmm[.ss]

現在の日時の代わりに、‘-t’ オプションの引数を使用する (引数の構成は、4 桁または 2 桁の年 (省略可)、月、日、時、分、秒 (秒も省略可) である)。年が 2 桁のみ指定された場合、0 … 68 の範囲の年ならば、 cc は 20 であり、69 … 99 の範囲の年では、cc は 19 である。 年が全く指定されない場合は、引数は今年の日付だと解釈される。 閏秒に対応している例外的なシステムでは、ss が ‘60’ のこともありえる。

POSIX 1003.1-2001 以前のシステムでは、touch は次のような旧式の書式をサポートしている。すなわち、‘-d’, ‘-r’, ‘-t’ オプションのいづれによってもタイムスタンプが指定されていず、しかも、2 個以上の file が指定されていて、最初の file が ‘mmddhhmm[yy]’ の形を持ち、それが (yy が存在するなら、それを先頭に移せば) ‘-t’ オプションに対する有効な引数と見なすことができる場合に、その引数の表している年度が 1969–1999 の範囲にあるならば、その引数をファイル名ではなく、 他のファイルに適用する日時と解釈する、というものである。 この旧式の動作は、環境変数 _POSIX2_VERSION によってコントロールすることができるが (see section 規格への準拠)、移植を考慮したスクリプトでは、 動作がこの環境変数に依存するコマンドの使用は避けるべきである。 たとえば、二通りの解釈ができる ‘touch 12312359 main.c’ を使うより、‘touch ./12312359 main.c’ や ‘touch -t 12312359 main.c’ を使用した方がよい。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.