やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

日付の連番から記事リンクを作る

 シェルで一発!

問題

 上の記事を作るとき、各記事へのリンク110件を自動作成したい。要件は以下。

 対象となる記事は以下の条件である。

  • 各記事のURLは毎日0時のものである: */YYYY/MM/DD/000000
    • 2021/11/272022/03/17の間にある記事が対象である

 以下のような出力結果になるはず。

* [http://ytyaru.hatenablog.com/entry/YYYY/MM/DD/000000:title]
* [http://ytyaru.hatenablog.com/entry/YYYY/MM/DD/000000:title]
* [http://ytyaru.hatenablog.com/entry/YYYY/MM/DD/000000:title]
...

結論

USER=ytyaru
TIME=000000
START=2021/11/27
  END=2022/03/17
DAYS=$(expr \( `date --date "${END}" +%s` - `date --date "${START}" +%s` \) / 86400)
seq 0 ${DAYS} | xargs -n1 -i date -d${START}+{}days +%Y/%m/%d | sed 's/^/\* \[http:\/\/'"${USER}"'.hatenablog.com\/entry\//g' | sed 's/$/\/'"${TIME}"':title\]/g' | xsel -bi

 こいつを端末にペーストして実行すれば、結果がクリップボードにコピーされる。

補足

 以下の値を調整すれば、異なるURLに対応できる。はてなユーザ名、記事の日時、を任意に変更したURLを作成できる。

USER=ytyaru
TIME=000000
START=2021/11/27
  END=2022/03/17
名前 意味
USER はてなユーザ ytyaru
TIME 記事の時刻 000000
START 作成開始日 2021/11/27
END 作成終了日 2022/03/17

過程

過程

seq 0 150 | xargs -n1 -i date -d2021/11/27+{}days +%Y/%m/%d > dates.txt

 今回は2021/11/272022/3/17の間が欲しい。何日間あるか数えるのが面倒。とりあえず11月から3月までは5ヶ月間。1ヶ月30日として150日間。seq 0 150とした。

dates.txt

2021/11/27
2021/11/28
2021/11/29
2021/11/30
2021/12/01
2021/12/02
2021/12/03
2021/12/04
2021/12/05
2021/12/06
2021/12/07
2021/12/08
2021/12/09
2021/12/10
2021/12/11
2021/12/12
2021/12/13
2021/12/14
2021/12/15
2021/12/16
2021/12/17
2021/12/18
2021/12/19
2021/12/20
2021/12/21
2021/12/22
2021/12/23
2021/12/24
2021/12/25
2021/12/26
2021/12/27
2021/12/28
2021/12/29
2021/12/30
2021/12/31
2022/01/01
2022/01/02
2022/01/03
2022/01/04
2022/01/05
2022/01/06
2022/01/07
2022/01/08
2022/01/09
2022/01/10
2022/01/11
2022/01/12
2022/01/13
2022/01/14
2022/01/15
2022/01/16
2022/01/17
2022/01/18
2022/01/19
2022/01/20
2022/01/21
2022/01/22
2022/01/23
2022/01/24
2022/01/25
2022/01/26
2022/01/27
2022/01/28
2022/01/29
2022/01/30
2022/01/31
2022/02/01
2022/02/02
2022/02/03
2022/02/04
2022/02/05
2022/02/06
2022/02/07
2022/02/08
2022/02/09
2022/02/10
2022/02/11
2022/02/12
2022/02/13
2022/02/14
2022/02/15
2022/02/16
2022/02/17
2022/02/18
2022/02/19
2022/02/20
2022/02/21
2022/02/22
2022/02/23
2022/02/24
2022/02/25
2022/02/26
2022/02/27
2022/02/28
2022/03/01
2022/03/02
2022/03/03
2022/03/04
2022/03/05
2022/03/06
2022/03/07
2022/03/08
2022/03/09
2022/03/10
2022/03/11
2022/03/12
2022/03/13
2022/03/14
2022/03/15
2022/03/16
2022/03/17
2022/03/18
2022/03/19
2022/03/20
2022/03/21
2022/03/22
2022/03/23
2022/03/24
2022/03/25
2022/03/26
2022/03/27
2022/03/28
2022/03/29
2022/03/30
2022/03/31
2022/04/01
2022/04/02
2022/04/03
2022/04/04
2022/04/05
2022/04/06
2022/04/07
2022/04/08
2022/04/09
2022/04/10
2022/04/11
2022/04/12
2022/04/13
2022/04/14
2022/04/15
2022/04/16
2022/04/17
2022/04/18
2022/04/19
2022/04/20
2022/04/21
2022/04/22
2022/04/23
2022/04/24
2022/04/25
2022/04/26

 これらを1行あたり先頭に[https://...`、末尾に`000000:title]を付与したい。

sed 's/^/\* \[http:\/\/ytyaru.hatenablog.com\/entry\//g' dates.txt
sed 's/$/\/000000:title\]/g' dates.txt

 パイプでつなぐと以下。

sed 's/^/\* \[http:\/\/ytyaru.hatenablog.com\/entry\//g' dates.txt | sed 's/$/\/000000:title\]/g'

 一時はファイルいらないな。削除しよう。そしてすべてパイプでつなげよう。

 以下、2021/11/27から150日分の日付を連番にした記事のはてな記法版リンクを作成する。

seq 0 150 | xargs -n1 -i date -d2021/11/27+{}days +%Y/%m/%d | sed 's/^/\* \[http:\/\/ytyaru.hatenablog.com\/entry\//g' | sed 's/$/\/000000:title\]/g'

 これを一般化すると以下。対応できるURLが幅広くなった。

TIME=000000
START=2021/11/27
DAYS=150
USER=ytyaru
# なし, :title, :bookmark, :detail, :barcode
seq 0 ${DAYS} | xargs -n1 -i date -d${START}+{}days +%Y/%m/%d | sed 's/^/\* \[http:\/\/'"${USER}"'.hatenablog.com\/entry\//g' | sed 's/$/\/'"${TIME}"':title\]/g'

 以下のような場合、さらに工夫が必要。でも、そこまでは対応しなくていいや。大変だから。

  • 時間
    • 指定した周期である(例:1日0時と12時)
    • いつも不定である
  • URL
  • 末尾
    • なし, :title, :bookmark, :detail, :barcode

 時間が不定だと、1つ1つURLを書いていくしかない。連番作成できない。だから時刻はいつも固定にしたほうが良い。むしろ固定しないと自動化できない。

 日数の計算も自動化したい。

USER=ytyaru
TIME=000000
START=2021/11/27
  END=2022/03/17
DAYS=$(expr \( `date --date "${END}" +%s` - `date --date "${START}" +%s` \) / 86400)
seq 0 ${DAYS} | xargs -n1 -i date -d${START}+{}days +%Y/%m/%d | sed 's/^/\* \[http:\/\/'"${USER}"'.hatenablog.com\/entry\//g' | sed 's/$/\/'"${TIME}"':title\]/g'

 これで開始日と終了日がわかっていれば、日数計算せずに済む。

 最後に、標準出力をクリップボードへコピーしたい。

USER=ytyaru
TIME=000000
START=2021/11/27
  END=2022/03/17
DAYS=$(expr \( `date --date "${END}" +%s` - `date --date "${START}" +%s` \) / 86400)
seq 0 ${DAYS} | xargs -n1 -i date -d${START}+{}days +%Y/%m/%d | sed 's/^/\* \[http:\/\/'"${USER}"'.hatenablog.com\/entry\//g' | sed 's/$/\/'"${TIME}"':title\]/g' | xsel -bi

 完成!

所感

 手作業でやってたら日が暮れる。スクリプトがないと生きていけない。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux