touchコマンドはファイルを作成するだけではないという話
Linuxでファイルを作成するときによくお世話になるtouchコマンド。そんな使い方をするコマンドだと思ってましたが、どうも誤解をしていました。
まず普通にファイルを作ってみましょう。
$ touch 01.txt $ touch 02.txt $ touch 03.txt $ ls -l 合計 0 -rw-r--r-- 1 masudak masudak 0 1月 8 21:25 01.txt -rw-r--r-- 1 masudak masudak 0 1月 8 21:25 02.txt -rw-r--r-- 1 masudak masudak 0 1月 8 21:26 03.txt
01, 02, 03という空ファイルができました。 これはよくある使い方です。
そしたら、次に以下のコマンドを打ちます。
$touch -t '201412310001.00' 02
-tで日付を渡します。
もう一度lsしてみる。
$ ls -l 合計 0 -rw-r--r-- 1 masudak masudak 0 1月 8 21:25 01.txt -rw-r--r-- 1 masudak masudak 0 12月 31 00:01 02.txt -rw-r--r-- 1 masudak masudak 0 1月 8 21:26 03.txt
見事タイムスタンプが変わりました。
man読むと、ちゃんと書いてあるんですね。
名前 touch - ファイルのアクセス時刻と修正時刻を変更する 説明 touch コマンドは指定したそれぞれの file のアクセス時刻、修正時刻またはいずれかを変更する。 特に指定がない場合は現在時刻に変更する。 -r オプションを使った場合、 ref_file の時刻を使い変更し、 -t オプションを使った場合には time で指定した時刻に変更する。 -t time time で指定した時刻を使い変更する。引き数は次のような明確な意味を持つ 10 進数の形式で指定する。 [[CC]YY]MMDDhhmm[.SS] CC を指定しない場合、年 CCYY は 1969-2068 の範囲となる (訳注: YY=69-99 の場合 CC=19、YY=00-68 の場合CC=20 と見做される)。 YY を指定しない場合には、現在の年が使われる。SS を指定しない場合、0 として見做される。 うるう秒を参照できるように 0-61 の範囲で指定できる。 結果の時刻は環境変数 TZ により指定されたタイムゾーンでの時刻となる。 結果の時刻が 1970 年 1 月 1 日以前になった場合、エラーとなる。
「ファイルを作成する」コマンドだと思ってましたが、「時刻を変更する」コマンドなんですね。勉強になりました。
ちなみに、これはファイルだけでなく、ディレクトリでもできます。
before:
$ ls -l 合計 16 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 01 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 02 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 03 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 04
after:
$ ls -l 合計 16 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 01 drwxr-xr-x 2 masudak masudak 4096 12月 31 00:01 02 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 03 drwxr-xr-x 2 masudak masudak 4096 1月 8 21:17 04
うむ、便利。
P.S. ちなみに、lsで表示する際も気をつける必要があります。lsコマンドの-lには以下のような意味があります。
-l ファイルのモード・リンクの数・所有者名・グループ名・ (バイト単位の) サイズ・タイムスタンプ・名前を (1 列形式で) 書き出す。 デフォルトでは、表示されるイムスタンプは最終修正時刻である。オプション -c と -u のときは、他の 2 つのタイムスタンプを選択する。 デバイススペシャルファイルの場合、通例として、サイズを表示する場所がデバイスのメジャー番号とマイナー番号に置き換えられる。
なので、最終修正時刻が変わりましたね。-cとかだと表示は変わらないので、はまらないようにしてください。