Дорабатываем bashblog напильником, часть третья - исправляем таймстемпы
Не бывает бочки мёда без пары ложек дёгтя. Если привкус дёгтя вам по вкусу - можно ничего не менять и наслаждаться жизнью, в противном случае требуется какое-то вмешательство. Проблема, которую будем сегодня решать - это даты или таймстемпы, кому как привычнее. Дело в том, что когда работа с bashblog производится на одной машине, то проблем не возникает, но как только мы уносим проект в git и делаем checkout на другой машине, то все даты создания файлов на локальной файловой системе будут совпадать со временем чекаута. Например:
-rw-r--r-- 1 corpse corpse 12K ноя 1 14:17 nemnogo-ob-avtomaticheskoj-generacii-parolej.html
-rw-r--r-- 1 corpse corpse 9,0K ноя 1 14:17 o-detalyax-i-pamyati.html
-rw-r--r-- 1 corpse corpse 15K ноя 1 14:17 okna-v-okne---pro-evolyuciyu-virtualizacii.html
-rw-r--r-- 1 corpse corpse 30K ноя 1 14:17 pro-klaviatury-gryaznye-xaki-i-podgoranie-pyatoj-tochki.html
-rw-r--r-- 1 corpse corpse 13K ноя 1 14:17 pro-lyubov-k-minimalizmu-i-staticheskuyu-generaciyu-kontenta.html
Bashblog устроен таким образом, что он при каждом rebuild или посте переписывает даты и время публикации поста на время создание файла. То есть, вы сделали десяток постов, потом решили добавить ещё один, находясь за другим компьютером, сделали checkout, создали новый пост и все ваши посты получили сегодняшнюю дату и время, когда вы выгрузили содержимое репозитория. Нехорошо. Есть два пути решения этой проблемы - либо вмешаться в содержимое bashblog и изменить его логику работы со временем и датой постов, либо после выгрузки изменять дату и время создания файлов на необходимые. Путь менее очевидный, но я предпочёл его, поскольку не хочу менять код bashblog без особой на то необходимости (чтобы не было мучительно больно после обновления самого bashblog при необходимости).
За что люблю *nix, так это за то, что в нём огромное множество проблем можно решить одной строкой. И эту проблему в частности. Итак, у нас есть тег с таймстемпом, который добавляет bashblog в каждый пост:
<!-- bashblog_timestamp: #201810191505.32# -->
Необходимо пройтись по всем html файлам, в составе которых есть этот таймстемп, затем для каждого поста изменить время создания файла на необходимое. Прогнав банальное
grep '<!-- bashblog_timestamp: .*$' *.html
обнаруживаем, что в файлах index.html и начинающихся с префикса tag_ таймстемпы содержатся по нескольку раз. Логично предположить, что эти файлы перестраиваются уже после того, как получают дату и время изменения файлов самих статей, поэтому индекс и статику с тегами нужно исключить.
$ grep '<!-- bashblog_timestamp: .*$' *.html | sed -e '/^\(tag_\|index.html\)/d'
aspekty-nastrojki-seti-v-qemu-obedinenie-interfejsov-na-kanalnom-urovne.html:<!-- bashblog_timestamp: #201810162150.30# -->
dorabatyvaem-bashblog-napilnikom-chast-vtoraya---podsvetka-sintaksisa.html:<!-- bashblog_timestamp: #201810120041.54# -->
...
Совсем другое дело! Ничего лишнего. Чтобы не заморачиваться с изменением переменной $IFS для прогона цикла по строкам, тем же седом отрежем всё лишнее:
$ grep '<!-- bashblog_timestamp: .*$' *.html | sed -e '/^\(tag_\|index.html\)/d;s/\(:[^#]*\|# .*$\)//g'
aspekty-nastrojki-seti-v-qemu-obedinenie-interfejsov-na-kanalnom-urovnehtml#20181016215030
dorabatyvaem-bashblog-napilnikom-chast-vtoraya---podsvetka-sintaksisahtml#20181012004154
...
Совсем замечательно. Теперь остаётся пройти по полученному результату в цикле и изменить время и дату. А вот тут небольшой фирменный чит: проще всего в данном случае пройтись по полученным строкам с помощью awk, используя в качестве разделителя символ '#' - не зря же мы его оставили. Необходимо сгенерировать набор команд, производимых над файлами, после чего через тот же пайп отправить этот список команд на выполенение интерпретатору. В нашем случае это будет sh. Для начала произведём тест:
$ touch -a -m -t 201801020305.06 v-rotejt-mne-logi-pro-minimalizm-busybox-i-logirovanie.html
$ ./bb.sh list
1 Про клавиатуры, грязные хаки и подгорание пятой точки 2018-11-01 14:17:07
2 Про любовь к минимализму и статическую генерацию контента 2018-11-01 14:17:07
...
9 АСПЕКТЫ НАСТРОЙКИ СЕТИ В QEMU. ОБЪЕДИНЕНИЕ ИНТЕРФЕЙСОВ НА КАНАЛЬНОМ УРОВНЕ. 2018-11-01 14:17:07
10 В ротейт мне логи! Про минимализм, busybox и логирование. 2018-01-02 03:05:06
Как видим, работает, дата и время поста изменились. Итак, результат будет выглядеть следующим образом:
$ grep '<!-- bashblog_timestamp: .*$' *.html | sed -e '/^\(tag_\|index.html\)/d;s/\(:[^#]*\|# .*$\)//g'
aspekty-nastrojki-seti-v-qemu-obedinenie-interfejsov-na-kanalnom-urovne.html#201810162150.30
dorabatyvaem-bashblog-napilnikom-chast-vtoraya---podsvetka-sintaksisa.html#201810120041.54
dorabatyvaem-napilnikom-bashblog-chast-pervaya.html#201810112252.15
nemnogo-ob-avtomaticheskoj-generacii-parolej.html#201810191505.32
o-detalyax-i-pamyati.html#201810120159.48
okna-v-okne---pro-evolyuciyu-virtualizacii.html#201810161635.23
pro-klaviatury-gryaznye-xaki-i-podgoranie-pyatoj-tochki.html#201810290058.20
pro-lyubov-k-minimalizmu-i-staticheskuyu-generaciyu-kontenta.html#201810112252.15
sam-sebe-xosting-ili-o-nedoocenyonnyx-utilitax.html#201810210049.04
v-rotejt-mne-logi-pro-minimalizm-busybox-i-logirovanie.html#201810171509.07
$ grep '<!-- bashblog_timestamp: .*$' *.html | sed -e '/^\(tag_\|index.html\)/d;s/\(:[^#]*\|# .*$\)//g' | awk -F '#' '{ print "touch -a -m -t "$2" "$1 }'
touch -a -m -t 201810162150.30 aspekty-nastrojki-seti-v-qemu-obedinenie-interfejsov-na-kanalnom-urovne.html
touch -a -m -t 201810120041.54 dorabatyvaem-bashblog-napilnikom-chast-vtoraya---podsvetka-sintaksisa.html
touch -a -m -t 201810112252.15 dorabatyvaem-napilnikom-bashblog-chast-pervaya.html
touch -a -m -t 201810191505.32 nemnogo-ob-avtomaticheskoj-generacii-parolej.html
touch -a -m -t 201810120159.48 o-detalyax-i-pamyati.html
touch -a -m -t 201810161635.23 okna-v-okne---pro-evolyuciyu-virtualizacii.html
touch -a -m -t 201810290058.20 pro-klaviatury-gryaznye-xaki-i-podgoranie-pyatoj-tochki.html
touch -a -m -t 201810112252.15 pro-lyubov-k-minimalizmu-i-staticheskuyu-generaciyu-kontenta.html
touch -a -m -t 201810210049.04 sam-sebe-xosting-ili-o-nedoocenyonnyx-utilitax.html
touch -a -m -t 201810171509.07 v-rotejt-mne-logi-pro-minimalizm-busybox-i-logirovanie.html
$ grep '<!-- bashblog_timestamp: .*$' *.html | sed -e '/^\(tag_\|index.html\)/d;s/\(:[^#]*\|# .*$\)//g' | awk -F '#' '{ print "touch -a -m -t "$2" "$1 }' | sh
$ ./bb.sh list
1 Про клавиатуры, грязные хаки и подгорание пятой точки 2018-10-29 00:58:20
2 Сам себе хостинг или о недооценённых утилитах 2018-10-21 00:49:04
3 Немного об автоматической генерации паролей 2018-10-19 15:05:32
4 В ротейт мне логи! Про минимализм, busybox и логирование. 2018-10-17 15:09:07
5 АСПЕКТЫ НАСТРОЙКИ СЕТИ В QEMU. ОБЪЕДИНЕНИЕ ИНТЕРФЕЙСОВ НА КАНАЛЬНОМ УРОВНЕ. 2018-10-16 21:50:30
6 Окна в окне - про эволюцию виртуализации 2018-10-16 16:35:23
7 О деталях и памяти 2018-10-12 01:59:48
8 Дорабатываем bashblog напильником, часть вторая - подсветка синтаксиса 2018-10-12 00:41:54
9 Дорабатываем напильником bashblog, часть первая 2018-10-11 22:52:15
10 Про любовь к минимализму и статическую генерацию контента 2018-10-11 22:52:15
Как легко можно заметить, когда я писал второй пост, я об этой проблеме не знал, после того, как заметил, начал пользоваться rsync для синхронизации между машинами, но теперь можно пользоваться описанной выше строкой. Например, в таком виде:
#!/bin/sh
cd `dirname "$0"`
git pull origin master grep '<!-- bashblog_timestamp: .*$' *.html | sed -e '/^\(tag_\|index.html\)/d;s/\(:[^#]*\|# .*$\)//g' | awk -F '#' '{ print "touch -a -m -t "$2" "$1 }' | sh
Так же не помешает добавить обёртку для редактирования или создания нового поста и включить туда эту строку. Думаю, затруднений это не доставит.
P.S.: Как обычно, написание скрипта занимает минуту, статьи в блог - не менее часа.