Unixのタイムスタンプの種類
前回も書いてますが、タイムスタンプには以下の4つの種類があります。
- atime: 最後に利用した時間(Last Accessed Time)
- mtime: 最後に変更した時間(Last Modified Time)
- ctime: 最後にInode情報が変更された時間(Last Changed Time)
- btime: 生成された時間(Birth Time)
ファイルのタイムスタンプを調べる、と言ったらまずls -l
を思い浮かべますが、
それはmtime
でファイルの最終変更時間を示しているものになります。
btime
に関してはOSやファイルシステムによってない場合もあります。
ほとんどのLinuxのシステムでは設定されておらず、
MacなどBSD系では設定されてることが多いです。
Unixのタイムスタンプのチェック方法
よく使うファイル情報のとり方はls
ですが、
一番良くやるのはls -l
でファイルの詳細を見てそこにある時間を見ることだと思います。
ls
で上の時間をそれぞれ見るためには
ls -lu
: atime (-a
が別に使われてるので仕方なく?update
?)ls -l
: mtimels -lc
: ctimels -lU
: btime (BSD版lsのみ、GNU版だとdo not sort
オプションになる)
とします。
また、stat
コマンドを使うとファイルの細かい情報を一気に見ることができますが、
Linux(GNU)、BSDでそれぞれ以下の様にして上にある時間をそれぞれ取得することができます。
- Linux:
stat --print="atime: %x\nmtime: %y\nctime: %z\nbtime: %w\n" file
- BSD:
stat -f "atime: %Sa%nmtime: %Sm%nctime: %Sc%nbtime: %SB%n" file
Linux/BSD間で文法がこれだけ違うものも珍しいですが。
また、find
でファイルを検索するときも
-amin
、-atime
、-mmin
、-mtime
、-cmin
、-ctime
、-Bmin
、-Btime
と言った具合にそれぞれの時刻を用いた検索オプションがあります。
この場合もBtime
find ./ -amin 10
で10分前に利用されたファイルの検索。
+10
とすると10分以上前、-10
とすると10分以内、になります。
atime
の方はあGNU版だと日数です。
BSD版だと単位がなければ日数、単位を付けて10s
(10秒)とか1w(1週間)とかすることもできます。
touchによるタイムスタンプの変更
touch
では特定のタイムスタンプを変更することができます。
何もオプションを付けなければすべて(btime
以外)を現在時刻に更新します。
touch -a
とすればatime
、ctime
が変更されmtime
はそのままです。
touch -m
とすればmtime
、ctime
が変更されatime
はそのままです。
touch
のマニュアルを読むと-a
はaccess timeだけを変更、などと書いてありますが、
ctime
はファイルシステムの管理するところで簡単に維持れるところではない、という感じで
touch
でそれだけアップデートしたりはできません。
$ touch -m -t "200101010101.01" file
の様に-t
で時間を指定すると(2001年、01月、01日、01時、01分、01秒)
その時間に設定することもできます。
その他変更されるパターン
- lessで開いた場合
プログラムからのアクセスに関してはatime
だけが変更されます。
なのでless
で開くと開いた時間
にatime
だけが変更されます。
- vimで開いた場合
vimで開いた場合もless
と同じです。
ただし、変更を保存したりするとmtime
、ctime
も変わります。
atime
も保存したときに改めて更新されます。
- 上書きコピーされた場合
もともとfile2があってそれに他のファイルコピーした場合
$ cp file file2
この場合、file2のmtime
、ctime
だけが変更されてatime
はfile2のもともとのもののまま変更されません。
- mvした場合
ファイルをmv
でリネーム(移動)させた場合、ctime
だけが変わります。
mv
で他のファイルを上書きしたとしても元のファイルの情報が使われます。
もともとfile2があって、
$ mv file file2
とした場合、file2のタイムスタンプはfileのatime
、mtime
が引き継がれ、
ctime
は更新されたものになります。