先月の月名が入ったファイルやディレクトリを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))"]