シェルで一発!
問題
上の記事を作るとき、各記事へのリンク110件を自動作成したい。要件は以下。
- はてな記法
[*:tilte]
を用いること
対象となる記事は以下の条件である。
- 各記事のURLは毎日0時のものである:
*/YYYY/MM/DD/000000
2021/11/27
〜2022/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 |
記事の時刻 | 00 時00 分00 秒 |
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/27
〜2022/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つ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
完成!
所感
手作業でやってたら日が暮れる。スクリプトがないと生きていけない。
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux