Pathname#stat メソッドを使います。 File::Stat クラスを返します。
> file = Pathname.new('test.mp4') => #<Pathname:test.mp4> > file.stat => #<File::Stat dev=0x1000004, ino=78701935, mode=0100644 (file rw-r--r--), nlink=1, uid=501 (riocampos), gid=20 (staff), rdev=0x0 (0, 0), size=43609067, blksize=4096, blocks=85176, atime=2016-04-04 00:04:28 +0900 (1459695868), mtime=2016-03-28 16:12:04 +0900 (1459149124), ctime=2016-04-04 00:03:07 +0900 (1459695787)>
なお似た名前のメソッドである Pathname#lstat メソッドは、レシーバがシンボリックリンクのとき「シンボリックリンクに関してリンクそのものの情報を File::Stat として返します」。
*timeとMacのFinderでの表示との対応
Finder | stat |
---|---|
最後に開いた日 | atime *1 |
変更日 | mtime |
追加日 | ctime |
作成日 | なし |
ちなみに、Finder に標準で表示されるのは変更日なので mtime 。 ls -l
で表示されるのも mtime 。
stat
コマンドでも Pathname#stat メソッドとほぼ同じ情報が表示される。ただし作成日(birthtime)も表示される。
$ stat test.mp4 16777220 78701935 -rw-r--r-- 1 riocampos staff 0 43609067 "Apr 4 00:04:28 2016" "Mar 28 16:12:04 2016" "Apr 4 00:03:07 2016" "Mar 28 16:12:04 2016" 4096 85176 0 test.mp4 $ stat -s test.mp4 st_dev=16777220 st_ino=78701935 st_mode=0100644 st_nlink=1 st_uid=501 st_gid=20 st_rdev=0 st_size=43609067 st_atime=1459695868 st_mtime=1459149124 st_ctime=1459695787 st_birthtime=1459149124 st_blksize=4096 st_blocks=85176 st_flags=0
st_* の意味は stat(2) Mac OS X Developer Tools Manual Page を参照。
タイムスタンプの更新メソッド
Pathname#utime を使います。
後記する touch
コマンドと同じことが出来ますね。
utime(atime, mtime) -> Integer
File.utime(atime, mtime, self.to_s) と同じです。
[PARAM] atime:
最終アクセス時刻を Time か、起算時からの経過秒数を数値で指定します。
[PARAM] utime:
更新時刻を Time か、起算時からの経過秒数を数値で指定します。
書いてあったように、File.utime に対応します。
utime(atime, mtime, *filename) -> Integer
ファイルの最終アクセス時刻と更新時刻を変更します。変更したファイルの数を返します。変更に失敗した場合は例外 Errno::EXXX が発生します。
touch -r src_file dest_file
、つまり src_file のタイムスタンプを dest_file にコピーする、のを Pathname クラスで行うには次のようにすればよいですね。
src_file = Pathname.new("src_file") dest_file = Pathname.new("dest_file") dest_file.utime(src_file.atime, src_file.mtime)
なお Pathname.new
の代わりに Kernel#Pathname
も使えます(つまりPathname("src_file")
と書いても良い)。
参考:*timeの意味
UNIX のファイルには、一般的に 3つのタイムスタンプがある。
atime … 最終アクセス時刻 (access time)
mtime … 最終変更時刻 (modify time)
ctime … 最終ステータス変更時刻 (change time)atime・mtime・ctime
atime は、最後にファイルにアクセスした時刻のこと。より正確には、ファイル内容を read(2) した場合に変更される。ファイルをオープンしただけでは変更されないし、ファイル内容を write(2) しても変更されない。当然ながら、read(2) する権限がなかった場合も変更されない。
mtime は、最後にファイルを変更した時刻のこと。より正確には、ファイルに write(2) または truncate(2) した場合に変更される。
ctime は、最後にファイルを変更した時刻のこと。より正確には、ファイルに write(2) または truncate(2) した場合、そして inode データの修正を行った場合に変更される。
:タイムスタンプの表示
ls -l
で mtime、ls -lc
で ctime、ls -lu
で atime を表示することができる。
:タイムスタンプの変更
atime・mtime は、
touch
コマンドを用いれば (つまり utimes(2) を用いれば) 任意の時刻を設定することが可能である。
(引用者註:touch
コマンドはオプション無しで atime と mtime の両方、-a オプションで atime のみ、-m オプションで mtime のみ設定。-r オプションを使うと、[-r file] で指定したファイルのタイムスタンプをコピーする。touch(1) Mac OS X Manual Page 参照)
:ファイル生成時刻
伝統的な UNIX では、ファイル生成時刻は保持していない。
UNIXの部屋 コマンド検索:タイムスタンプ (*BSD/Linux)
*1:ただしquicklookで見た場合にも atime は更新されるが「最後に開いた日」は更新されない