2017年10月1日日曜日

BSD date で日付文字列を書き換える

BSD date コマンドでは、オプション -j を付け、-f と + のオプションを使うことで、OSの日付を設定することなく、日付文字列を書き換えることが出来ますね。(LANG=C が前提です。)

% date
Sun Oct  1 00:08:38 JST 2017
% date -j -f "%a %b %d %T %Z %Y" "`date`" "+%y%m%d%H"
17100100

で、FreeBSD snapshot manager を使っていると、zfs のスナップショットを世代番号で作ってくれるのですが、何時のものなのかが、ちょっとわかりにくい。実際は、こう書けば日付が出てくるわけです。

% zfs get creation zfspool/home@daily.0
NAME                  PROPERTY  VALUE                  SOURCE
zfspool/home@daily.0  creation  Sun Oct  1  0:00 2017  -
% zfs get -H -o value creation zfspool/home@daily.0
Sun Oct  1  0:00 2017
% zfs get -H -o value creation zfspool/home@daily.1
Sat Sep 30  0:00 2017

ってことは、

% date -j -f "%a %b %d %T %Y" "`zfs get -H -o value creation zfspool/home@daily.0`"+%y%m%d%H"
17100100
% date -j -f "%a %b %d %T %Y" "`zfs get -H -o value creation zfspool/home@daily.1`"+%y%m%d%H"
17093000

なんて具合に日付文字列を取り出せるわけです。FreeBSD snapshot manager と zfs send で差分バックアップしたい、でもファイル名をどうしたらいいか分からない、と悩んでいたんですが、これで何とかなりそう。

ちなみにLANGがC以外だと…

% setenv LANG ja_JP.UTF-8
% date
2017年 10月 1日 日曜日 00時23分52秒 JST
% date -j -f "%a %b %d %T %Z %Y" "`date`" "+%y%m%d%H"
Failed conversion of ``2017年 10月 1日 日曜日 00時23分54秒 JST'' using format ``%a %b %d %T %Z %Y''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]

% setenv LANG C
% date
Sun Oct  1 00:24:06 JST 2017
% date -j -f "%a %b %d %T %Z %Y" "`date`" "+%y%m%d%H"
17100100

まあ、こんなもんです。