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は更新されたものになります。
