rcmdnk's blog

アマノ タイムスタンプPIX-200

前回ファイルの初期化の話の中でタイムスタンプについてあったので それについてもう少し詳しく。

Sponsored Links

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: mtime
  • ls -lc: ctime
  • ls -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とすればatimectimeが変更されmtimeはそのままです。

touch -mとすればmtimectimeが変更され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と同じです。 ただし、変更を保存したりするとmtimectimeも変わります。 atimeも保存したときに改めて更新されます。

  • 上書きコピーされた場合

もともとfile2があってそれに他のファイルコピーした場合

     $ cp file file2

この場合、file2mtimectimeだけが変更されてatimefile2のもともとのもののまま変更されません。

  • mvした場合

ファイルをmvでリネーム(移動)させた場合、ctimeだけが変わります。 mvで他のファイルを上書きしたとしても元のファイルの情報が使われます。

もともとfile2があって、

   $ mv file file2

とした場合、file2のタイムスタンプはfileatimemtimeが引き継がれ、 ctimeは更新されたものになります。

Sponsored Links
Sponsored Links

« シェルでファイルを初期化する方法