それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

date コマンドで相対日付で目的の日をパパっと計算する。(毎月の最初の月曜日など)

date コマンドをさらに、見なおしてみた。意外と使えるんじゃないかと思うんですね。

dateコマンドを活用するのに最初に覚えること

  1. ”+ 1day”
  2. %F オプション

これを覚えとくだけで、そこそこ使い勝手がいい。

実例

ある日から90日後を探す
takuya@atom:~$ date --date "2012/11/22 + 90days" +"%F"
2013-02-20

ね?便利でしょ

--date で日付を指定

+"%F" で %Y-%m-%d の省略形

takuya@atom:~$ date --date "2011/11/22" +"%F"
2011-11-22

最初に、以上を覚えておけば、直ぐ使えます。

それでは、使い込んでみましょう

相対的日時を求める

ある日から、一ヶ月後
takuya@atom:~$ date --date "2012/11/22 + 1month" +"%F"
2012-12-22

ある日から、1日前

takuya@atom:~$ date --date "2012/3/1 - 1days" +"%F"
2012-02-29

オプションをもうちょっと。

もうちょっと細かく使い込む。

オプションの重ね書きが可能

takuya@air:~/Desktop$ date --date "today next monday next month" +"%F"
2012-12-26

去年のクリスマスは何曜日?

takuya@air:~/Desktop$ date --date "2012/12/25" +"%F(%a)"
2012-12-25(火)

特定の日を調べたければ、calコマンド使えって話ですけどね。

毎月の最初の月曜日を求める。

毎月の最初の月曜日を求める。

date --date "this month next monday " +"%F"
2021-03-08

毎月の最後の月曜日を求める。

月の最後の月曜日を求めるには、いったん翌月1日を得たあとに、そこから直近月曜日をさかのぼり求めておけばできる。

$ date --date "next month last monday " +"%F"
2021-03-22

コマンドを更に組合わせる

date コマンドが相対日付を扱えるので、日付をまとめて作るのがとても簡単

takuya@air:~/Desktop$ for i in {0..30}; do date --date "2012-11-01 +$i days" +"%F"  ; done
2012-11-01
2012-11-02
2012-11-03
2012-11-04
2012-11-05
2012-11-06
2012-11-07
2012-11-08
2012-11-09
2012-11-10
2012-11-11
(中略
2012-11-27
2012-11-28
2012-11-29
2012-11-30
2012-12-01

直近30日の日付をパパっと作れるのですね。これは便利ですね。

さらに、バッククオートと組合わせる。

日付でディレクトリやファイルを作ることが出来るよね。

takuya@air:~/Desktop/date$ for i in {0..30}; do mkdir `date --date "2012-11-01 +$i days" +"%F"`  ; done
takuya@air:~/Desktop/date$ ls 
2012-11-01  2012-11-05	2012-11-09  2012-11-13	2012-11-17  2012-11-21	2012-11-25  2012-11-29
2012-11-02  2012-11-06	2012-11-10  2012-11-14	2012-11-18  2012-11-22	2012-11-26  2012-11-30
2012-11-03  2012-11-07	2012-11-11  2012-11-15	2012-11-19  2012-11-23	2012-11-27  2012-12-01
2012-11-04  2012-11-08	2012-11-12  2012-11-16	2012-11-20  2012-11-24	2012-11-28

おお、コマンド使える。

昨日のバックアップを定期的に取るなら

rsync -avz --no-P /var/www /var/backup/`date --date="yesterday"`

これをcronに書けばいいですね。

ちなみに、date コマンドが使ってる日付フォーマットは

man strftime

で見ることができます。

-d は --date オプションでも可能

takuya@air:~/Desktop$ date -d "2012/12/25" +"%F(%a)"
2012-12-25(火)

GNU date の書式

これらは、GNU Coreutilsの date コマンドの書式になるので、gnu date を内部的に呼び出しているようなプログラム言語や、互換性があるものは概ね紹介した ` next month ` ` 3 days ago ` などが使える。
https://www.gnu.org/software/coreutils/manual/html_node/Examples-of-date.html

2021-03-01 更新

毎月の最初の月曜日・最後の月曜日求める方法を記載。gnu date について言及