Springe zum Hauptinhalt

Linux: One-liner to the rescue

Dieses Blog wird mit Nikola erzeugt. Um die Änderungen nachverfolgen und ggf. rückgängig machen zu können, wird außerdem die Versionsverwaltung Git eingesetzt.

Kürzlich musste ich feststellen, dass ein externer Link nicht mehr funktionierte. Mit dem Befehl nikola check -l -r habe ich dann einfach das komplette Blog auf defekte Links untersucht. Dabei musste ich feststellen, dass etliche Links nicht mehr funktionierten bzw. Umleitungen eingerichtet worden waren. Also habe ich die Meldungen von dem o. g. Befehl genommen und die entsprechenden Links angepasst. Die Änderungen wurden dann mit einem Commit in das Git-Repository übertragen.

Im weiteren Verlauf der Arbeiten am Blog fiel mir dann auf, dass ich bei den Änderungen der Links in den einzelnen Beiträgen das Feld .. updated: im Kopf der Dateien nicht angepasst hatte. Dieses Feld wird zwar vom aktuellen Theme des Blogs nicht genutzt, könnte aber ggf. bei zukünftigen Änderungen am Theme von Bedeutung sein.

Nun stellte sich die Frage, wie ich mit möglichst wenig Aufwand an die Dateinamen der betroffenen Dateien kommen sollte - es waren nämlich nicht alle Beiträge betroffen - und wie ich die Änderungen dann einpflegen sollte.

Im ersten Schritt habe ich mit git log --stat --grep="Links" die Dateien aus dem Repository anzeigen lassen, deren Commit-Message das Wort Links enthält. Die Ausgabe brauchte ich nur noch in eine Datei (hier: cf.txt) kopieren und geringfügig bearbeiten. Damit hatte ich dann die Eingabedatei für den nächsten Schritt.

Im Verzeichnis mit den Blogbeiträgen reichte dann der folgende Einzeiler, um die besagte Zeile im Kopf der Beiträge zu ändern:

while read line; do sed -i -e 's|^.. updated:.*|.. updated: 2023-06-10 14:30 UTC+02:00|' "$line"; done < ~/cf.txt

Anmerkung: Die Befehlsfolge wird in der Anzeige möglicherweise umbrochen dargestellt.

Dieser Einzeiler liest die Datei (cf.txt) mit den betroffenen Blogbeiträgen ein und führt für jede Zeile ein sed-Skript aus. Dieses Skript sucht nach einer Zeile, die am Zeilenanfang den Text .. updated: und anschließend beliebige Zeichen enthält und tauscht diesen Text gegen den Wert .. updated: 2023-06-10 14:30 UTC+02:00 aus.

Anschließend musste ich nur noch einen neuen Commit in das Git-Repository schreiben, um die Änderungen festzuhalten und konnte dann mit nikola build und nikola deploy die Beiträge neu erzeugen und auf den Webserver übertragen.

Zugegeben - es war etwas mehr Arbeit als nur einen Einzeiler zu schreiben. Aber m. E. zeigt sich hier wieder einmal, wie man mit der Shell und ihren Möglichkeiten viel mühsame Handarbeit umgehen kann. Und den Lerneffekt bei solchen Arbeiten darf man auch nicht unterschätzen.