第1話 utimeとtouch
utimeそれはファイルのatimeとmtimeを設定する関数である。
こんな使い方をする。
$ touch a.txt
$ perl -E 'say utime(1,1,"a.txt")'
$ stat a.txt
Access: 1970-01-01 09:00:01.000000000 +0900
Modify: 1970-01-01 09:00:01.000000000 +0900
なお、これはtouchコマンドでも可能である
$ touch -t 197001010900.02 a.txt
Access: 1970-01-01 09:00:02.000000000 +0900
Modify: 1970-01-01 09:00:02.000000000 +0900
2話 高精度とTime::HiRes
さて、近年のファイルシステムでは1秒以下の日付分解能を持っているので
ミリ秒単位での設定もしたいのだが、これは上記2つでは対応していないのでできない。
そこで現る高精度の時刻を扱うTime::HiResモジュール様のご登場。
Time :: HiRes - 高解像度アラーム、スリープ、gettimeofday、インターバルタイマー - metacpan.org
3話 エラーとバージョン
$ perl -MTime::HiRes -E 'say Time::HiRes::utime(3.33,3.33, "a.txt")'
utime is not a valid Time::HiRes macro at -e line 1.
$ rpm -q perl-Time-HiRes
perl-Time-HiRes-1.9725-3.el7.x86_64
どういうこと\(^o^)/
どうやらTime::HiResにtimeが実装されたのは1.9733(2016-04-23)~1.9739(2016-06-28)で、CentOS7系のは1.9725(2012-02-01)なので未対応ということだ。
4話 buildとinstall
こうなったら最新のに差し替えてみる。
# yum install epel
# yum install cpanspec
# cpanspec --packager ymko Time::HiRes
# yum-builddep perl-Time-HiRes.spec
# yum install gcc
$ mkdir -p rpmbuild/SOURCES
$ cp Time-HiRes-1.9742.tar.gz rpmbuild/SOURCES/
$ vi perl-Time-HiRes.spec
Epoch: 4
$ rpmbuild -ba --define "dist .el7" perl-Time-HiRes.spec
# rpm -Uvh /home/ymko/rpmbuild/RPMS/x86_64/perl-Time-HiRes-1.9742-1.el7.x86_64.rpm
5話 勝利と参考文献
3.33秒に設定する。
$ perl -MTime::HiRes -E 'say Time::HiRes::utime(3.33,3.33, "a.txt")'
$ stat a.txt
Access: 1970-01-01 00:00:03.330000000 +0000
Modify: 1970-01-01 00:00:03.330000000 +0000
Perlモジュールtarボールからspecファイルを生成するコマンドcpanspec - Qiita
カスタムRPMや独自yumリポジトリではじめるソフトウェア管理術 - さくらのナレッジ
「Epoch」はパッケージの新旧を比較するために使われる数値で、指定されていない場合は「0」と見なされる。rpmコマンドやyumコマンドでパッケージをアップデートする場合、通常はVersionやReleaseの値の大小を比較してバージョンの新旧をチェックするのだが、Epochの値が指定されていた場合は、この値の大小でバージョンの新旧がチェックされる。つまり、VersionやReleaseの値が古い(数値が小さい)場合でも、Epochの値が大きければそちらのパッケージがより新しいものと認識される。