先月の月名が入ったファイルやディレクトリをlsする方法
いっつも忘れるのでメモ。dateコマンドの結果をプロセス置換してlsコマンドなどに食わせるとき、意図しない動作になることがある。例えば今日(今月)みたいな、31日まである日にdateコマンドの引数に –date=1 month ago をつけたところで
$ date +%Y/%m/%d "--date=1 month ago" 2017/12/01
となってしまう。
[amazonjs asin=”479815296X” locale=”JP” title=”ふわっと癒され北のリス エゾリーナ カレンダー 2018 (翔泳社カレンダー)”]
lsコマンドの結果で
合計 88 -rw-r--r-- 1 nullpopopo nullpopopo 158 11月 2 00:05 2017-11-01.txt -rw-r--r-- 1 nullpopopo nullpopopo 316 11月 3 00:05 2017-11-02.txt -rw-r--r-- 1 nullpopopo nullpopopo 453 11月 4 00:05 2017-11-03.txt -rw-rw-r-- 1 nullpopopo nullpopopo 2556 11月 5 00:05 2017-11-04.txt (略)
こう表示されて欲しいのだが、以下のように何も工夫しないと
[nullpopopo@marina ~]$ ll ${HOME}/APPS/LOGS/OLD/CommonLifeLog/$(date +%Y/%m/ "--date=1 days ago") 合計 88 -rw-rw-r-- 1 nullpopopo nullpopopo 475 12月 3 00:05 2017-12-02.txt -rw-rw-r-- 1 nullpopopo nullpopopo 1859 12月 4 00:05 2017-12-03.txt -rw-rw-r-- 1 nullpopopo nullpopopo 1139 12月 5 00:05 2017-12-04.txt (略)
こうなってしまう(そりゃそうだ)。正しく「前月」のファイル一覧を出したいなら
[nullpopopo@marina ~]$ ll ${HOME}/APPS/LOGS/OLD/CommonLifeLog/$(date -d "$(date +%Y/%m/1) -1 day" +%Y/%m) 合計 88 -rw-rw-r-- 1 nullpopopo nullpopopo 158 11月 2 00:05 2017-11-01.txt -rw-rw-r-- 1 nullpopopo nullpopopo 316 11月 3 00:05 2017-11-02.txt -rw-rw-r-- 1 nullpopopo nullpopopo 453 11月 4 00:05 2017-11-03.txt -rw-rw-r-- 1 nullpopopo nullpopopo 2556 11月 5 00:05 2017-11-04.txt (略)
こうする。
dateコマンドのおさらい
いきなり応用例から書いてしまったが、dateコマンドに絞っておさらいしてみると、先ほどのlsコマンドの例から抜き出すとこうなる。
[nullpopopo@marina ~]$ date -d "$(date +%Y/%m/1) -1 day" +%Y/%m 2017/11
dateコマンドのフォーマット指定を削るとこうなる。
[nullpopopo@marina ~]$ date -d "$(date +%Y/%m/1) -1 day" 2017年 11月 30日 木曜日 00:00:00 JST
[nullpopopo@marina ~]$ LANG=C date -d "$(date +%Y/%m/1) -1 day" Thu Nov 30 00:00:00 JST 2017
つまり、「今月1日を基準として、その1日前」を表示するようにすれば、自ずと前月が表示される。むかーし、6年ほど前に力技で前月の初日と末日なんてのを出していたが、残念ながら今回のような考慮はなされていなかった。。。当時参考にされた方がいらっしゃったらごめんなさい。
じゃあ前々月はどうやって出力する?
先に例示した「date -d 〜」を入れ子にしてあげればよい。
[nullpopopo@marina ~]$ date -d "$(date -d "$(date +%Y/%m/1) -1 day" +%Y/%m/1) -1 day" +%Y/%m 2017/10
[nullpopopo@marina ~]$ date -d "$(date -d "$(date +%Y/%m/1) -1 day" +%Y/%m/1) -1 day" 2017年 10月 31日 火曜日 00:00:00 JST
さらにその前月は・・・
[nullpopopo@marina ~]$ date -d "$(date -d "$(date -d "$(date +%Y/%m/1) -1 day" +%Y/%m/1) -1 day" +%Y/%m/1) -1 day" +%Y%m 201709
だんだん入れ子が深くなると訳わかんなくなるので、任意の求めたい月があるなら別の手段を取ったほうがよさげ。
[amazonjs asin=”B00NAQGIPC” locale=”JP” title=”Linuxコマンドライン入門 1日目 (ネット時代の、これから始めるプログラミング(NextPublishing))”]