touchコマンドは、ファイルのタイムスタンプを変更します。また、空のファイルを作成するために使うこともできます。
ファイルのタイムスタンプには最終アクセス日時、最終修正日時、最終状態変更日時の3つがあります。3つのタイムスタンプの意味や確認方法(statコマンドやlsコマンド)については「最終アクセス日時(atime)、最終修正日時(ctime)、最終状態変更日時(mtime)とは」で説明していますので、よろしかったら参照してみてください。
※なお、「CentOS Linux release 8.4.2105」で動作検証しましたが、腑に落ちない動作がありました(特に-a、-mオプションの動作)。システム依存なのか他に理由があるのかわかりませんが、私の思いを【コメント】で記載しました。調べれば情報は出てくるのかもしれませんが、touchコマンドでそこまでのモチベーションはありませんでしたので、コメントするにとどめました。構文とオプション
構文は次の通りです。
touch [オプション] ファイル名
主なオプションを以下に示します。
オプション | 説明 |
---|---|
-c | 指定したファイルが存在しない場合、ファイルを作成しない |
-d 日時 | 指定した日時に変更する。日時は"YYYY-MM-DD hh:mm:ss"などの人が認識できる形式で指定できる |
-t 日時 | 指定した日時に変更する。時刻は[[CC]YY]MMDDhhmm[.ss]形式で指定する |
-a | 最終アクセス日時を変更する |
-m | 最終修正日時を変更する |
-r ファイル名 | ファイル名が持つ日時に変更する |
ファイルを作成する/作成しない
touchコマンドは指定したファイルが存在しない場合、空のファイルを作成します。
$ touch ファイル名
「-c」オプションを使うと、ファイルが存在しなければファイルは作成されません。
$ touch -c ファイル名
次の例は存在しないファイルfoo、barに対して、それぞれtouchコマンドを実行しています。
$ touch foo $ ls -l foo -rw-rw-r-- 1 tet tet 0 Jul 9 04:59 foo $ touch -c bar $ ls -l bar ls: cannot access 'bar': No such file or directory
現在の日時にタイムスタンプを更新する
オプションを指定しないで既存ファイルにtouchコマンドを実行すると、現在の日時にタイムスタンプを更新します。
$ touch ファイル名
次の例ではstatコマンドで3つのタイムスタンプを確認した後、タイムスタンプを更新しています。コマンドを実行した時刻を確認するため、dateコマンドに続けてtouchコマンドを実行します。
$ stat foo ... Access: 2021-07-09 04:59:39.920307449 +0900 Modify: 2021-07-09 04:59:39.920307449 +0900 Change: 2021-07-09 04:59:39.920307449 +0900 ... $ date; touch foo Fri Jul 9 05:07:56 JST 2021 $ stat foo ... Access: 2021-07-09 05:07:56.136819875 +0900 Modify: 2021-07-09 05:07:56.136819875 +0900 Change: 2021-07-09 05:07:56.136819875 +0900 ...
3つのタイムスタンプすべてが現在の日時に更新されました。
【コメント】
touchコマンドでファイルを新規作成したときは、3つのタイムスタンプは同じ。したがって、この例のように3つのタイムスタンプが更新されるのは新規作成時と整合性はある。
指定した日時にタイムスタンプを更新する
タイムスタンプを指定した時刻に修正するには「-d」か「-t」オプションを使います。
[[CC]YY]MMDDhhmm[.ss]形式で日時を指定する(-tオプション)
「-t」オプションで日時を指定する場合、[[CC]YY]MMDDhhmm[.ss]という形式で指定します。
$ touch -t [[CC]YY]MMDDhhmm[.ss] ファイル名
次の例では7月1日10時30分に更新しています。
$ touch -t 07011030 foo $ stat foo ... Access: 2021-07-01 10:30:00.000000000 +0900 Modify: 2021-07-01 10:30:00.000000000 +0900 Change: 2021-07-09 05:50:12.501291283 +0900 ...
最終アクセス日時と最終修正時刻が指定した日時に更新されました。
【コメント】
オプション無しでは3つのタイムスタンプが更新されたが、日時指定で最終状態変更日時(Change)は更新されない。touchコマンドに、最終状態変更日時だけを変更するオプションがない、つまり最終状態変更日時だけを変更できないこととは整合性がある気がする。
人が理解する形式で日時を指定する(-dオプション)
「-t」オプションと異なり、「-d」オプションは人間が理解するほとんどの形式で日時を指定することができます。
$ touch -d 日時 ファイル名
manページでは次のような形式が紹介されています。infoドキュメントにもっと詳しい説明があるようですので、他の書式を利用したい方は参照ください。
"Sun, 29 Feb 2004 16:21:42 -0800" "2004-02-29 16:21:42" "next Thursday"
この例では、わかりやすいと思われる「"YYYY-MM-DD hh:mm:ss"」という形式で指定します。
$ touch -d "2021-01-01 12:34:56" foo $ stat foo ... Access: 2021-01-01 12:34:56.000000000 +0900 Modify: 2021-01-01 12:34:56.000000000 +0900 Change: 2021-07-09 05:53:42.724215403 +0900 ...
「-t」オプションと同様に、最終アクセス日時と最終修正時刻が指定した日時に更新されました。
【コメント】
「-t」オプションと同様
最終アクセス日時、最終修正日時だけを更新する
最終アクセス時刻だけを更新(-a)、あるいは最終修正時刻だけを更新(-m)することもできる。
$ touch -a ファイル名 $ touch -m ファイル名
次の例では、それぞれのオプションを実行しタイムスタンプを確認します。ファイルfooの3つのタイムスタンプはすべて同じ状態から最終アクセス時刻だけ、あるいは最終修正時刻だけ更新します。
$ stat foo ... Access: 2021-07-09 06:02:00.931436848 +0900 Modify: 2021-07-09 06:02:00.931436848 +0900 Change: 2021-07-09 06:02:00.931436848 +0900 ... $ touch -a foo $ stat foo ... Access: 2021-07-09 06:04:50.786122381 +0900 Modify: 2021-07-09 06:02:00.931436848 +0900 Change: 2021-07-09 06:04:50.786122381 +0900 ... $ touch -m foo $ stat foo ... Access: 2021-07-09 06:04:50.786122381 +0900 Modify: 2021-07-09 06:05:28.614906447 +0900 Change: 2021-07-09 06:05:28.614906447 +0900 ...
「-a」、「-m」のどちらを使っても最終状態変更日時も更新されました。これは想定外です。
【コメント】
オンラインマニュアルにも「-a change only the access time」、「-m change only the modification time」と書いてあるので、最終状態変更日時も更新されるのは想定外です。catでファイルを表示しても、最終アクセス日時だけしか更新されないので、その動作とも整合性が取れていない。また日時指定で更新しても、最終状態変更日時は変更されなかったので、それとも整合性が取れてない。
他のファイルのタイムスタンプに合わせる
「-r」オプションを使うと、他のファイルのタイムスタンプと同じにすることができる。
$ touch -r ファイル1 ファイル2
次の例はファイルbarのタイムスタンプをファイルfooのタイムスタンプに合わせています。
$ stat foo ... Access: 2021-07-09 06:34:20.530233673 +0900 Modify: 2021-07-09 06:05:28.614906447 +0900 Change: 2021-07-09 06:18:03.423626649 +0900 ... $ touch -r foo bar $ stat bar ... Access: 2021-07-09 06:34:20.530233673 +0900 Modify: 2021-07-09 06:05:28.614906447 +0900 Change: 2021-07-09 06:39:51.611643261 +0900 ...
ファイルbarの最終アクセス日時と最終修正日時が、ファイルfooと同じになりました。
【コメント】
最終アクセス日時と最終修正日時だけが更新される動作は、日時指定と同様でその点は整合性が取れている。