カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

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とかだと表示は変わらないので、はまらないようにしてください。