今回は日付を扱うdateコマンドです。UNIX系のdateコマンドについて説明します。なお、機能は異なりますが、dateコマンドはWindowsのPowerShell、コマンドシェル(command.com)にもあります。

さて、今回もデスクトップのsampleディレクトリにサンプルとなるテキストファイルを入れておきます。また、カレントディレクトリはsampleディレクトリとします。コマンドならcd ~/Desktop/sampleです。

 これまでに何度か説明のないままdateコマンドを使ってきました。というか説明した気になっていましたが、連載目次を見返したら全く説明してませんでした。そんなdateコマンドですが、UNIX系でも系統によって使えるオプションが異なります。man dateとすると以下のようになります。また、構築している環境によっても異なる場合があります。

 dateコマンドで複雑なことはしない前提であれば基本的な指定だけで十分だと思います。より複雑なことをしなければならない場合はDateutilsなど日付ユーティリティを入れる方法もあります。

現在の日付を表示

 まず現在の日付を表示してみましょう。この場合は単純にdateと入力しリターンキーを押すだけです。表示されるのはローカルタイムです。

date

 ローカルタイムではなく協定世界時(昔の名前ならグリニッジ標準時)を表示したい場合は-uを指定します。

date -u

 UbuntuなどLinuxであればロングオプションで--utcを指定することもできます。macOSではエラーになります。

date --utc

現在の時間を表示

 次に現在の時間を表示してみましょう。dateとくればきっとtimeだろうと思いtimeと入力すると予想とは違った結果になります。

 timeはコマンドなどの処理時間を計測します。timeの後にコマンド名などを指定すれば処理にかかった時間などを表示してくれます。プログラムを開発している時には便利かもしれません。

time date

 ちなみにWindows/MS-DOSのコマンドシェル(command.com)ではtimeコマンドがあり、時間の表示と設定ができます。timeと入力すると新たな時間設定を求めてきますが、設定しない場合はそのままリターンキーを押します。

 ただ、現在のWindowsでは時間を変更すると問題が発生するので、新たな時間を入力しても図のようなメッセージが表示されてしまいます。

 話がそれたので今度こそ現在の時間を表示しましょう。24時間制で表示する場合は以下のように+%Rを指定します。

date +%R

日付を利用する

 プログラム/シェルスクリプト/コマンドラインから日付を利用したいこともあります。すでに、本連載の第4回で年月日のディレクトリを作成するコマンド例を掲載しています。結果オーライみたいな連載なのでオプションについての説明はありませんでした。(この段階で説明したと思い込んでました)

・第4回 ディレクトリ作成
 今日の年月日からディレクトリを作成
https://news.mynavi.jp/techplus/article/natonakucommand-4/

 第4回の連載で使用してたdateコマンドのオプションですが、年月日などを利用する場合は+記号をつけて、その後に文字列を指定します。年月日の場合は以下の文字になります。いずれも%で始まります。

%Y 西暦4桁の年数
%m 2桁の月
%d 2桁の日にち

dateコマンドの後に指定して確認してみましょう。シングルクオートで囲んでも囲まなくても同じ結果になりますが、囲んでおいた方が安全でしょう。

date '+%Y'
date '+%m'
date '+%d'

 第4回で使ったコマンドは以下のようになっています。これで年月日のディレクトリが作成されます。`(バッククオート)でdateコマンドを囲むと出力した結果をmkdirのコマンドのパラメーターとして利用できます。

mkdir `date '+%Y%m%d'`

ディレクトリではなくファイルを作成する場合は以下のようになります。ここでは拡張子はテキストファイルを示すtxtにしてありますが、他の拡張子でも大丈夫です。

touch `date '+%Y%m%d'`.txt

時間を利用する

 次に時間を利用してディレクトリ作成やファイルの作成を行ってみましょう。時間を利用する場合も+の後に文字列を指定します。時間の場合は以下の文字になります。

%H 2桁の時
%M 2桁の分
%S 2桁の秒

dateコマンドの後に指定して確認してみましょう。

date '+%H'
date '+%M'
date '+%S'

 時間を利用して現在の時間のディレクトリを作成する場合は以下のようになります。

mkdir `date '+%H%M%S'`

時間を利用したファイルを作成する場合は以下のようになります。

touch `date '+%H%M%S'`.txt

年月日まで含める場合は以下のようになります。

touch `date '+%Y%m%d%H%M%S'`.txt

年月日と時間の間にアンダーバーを入れる場合は以下のようになります。同様に他の記号や文字列を入れることもできます。

touch `date '+%Y%m%d_%H%M%S'`.txt

UNIXタイムとテンポラリファイル

 最後にUNIXタイム(UNIX時間)の表示についてです。UNIXタイムは1970年1月1日午前0時0分0秒からの経過ミリ秒です。UNIXタイムは%sで表示することができます。

date '+%s'

ファイル名として使用する場合は以下のようになります。また、UNIXタイムはテンポラリファイルの名前として利用される場合もあります。

touch `date +%s`.txt

 ちなみにテンポラリファイルを作成する場合は専用のmktempコマンドが用意されています。mktempの後にテンポラリファイルを作成するファイルパスを指定します。この時にファイル名にXXXのXを指定します。macOSではXは1つ以上で動作しますが、Linuxでは3つ以上指定しないとエラーになります。より安全にテンポラリファイルを生成するならXの数を多くしておきましょう。なお、テンポラリファイルが作成できなかった場合はエラーになります。

mktemp ./tmp_XXXXX
  • LinuxではXの数が3以上指定しないとエラーになる

  • テンポラリファイルが生成できなかった場合はエラーになる

 あとmktempコマンドの動作についての注意点としてはLinuxではファイル名にXXXがあればランダムな文字に置換されますが、macOSの場合は末尾にある場合のみ置換されます。以下の例のように拡張子txtを付加すると、それぞれ異なる結果になります。

 dateコマンドで使えるオプションは他にもたくさんありますが、地域依存(ロケール依存)だったりBSD系かLinux系かなどで異なります。Linux系では以下のように%Nでナノ秒を出力できますが、macOSでは対応していません。

date '+%N'

 とはいえdateコマンドを利用する場合は今回説明したもので十分ではないでしょうか。  ではまた次回

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。