Archiv für den Monat: September 2009

Dateien eines Jahres archivieren

Heute stand ich (mal wieder) vor der Aufgabe, in einem Verzeichnis alle Dateien vom Vorjahr zu archivieren.

Im Artikel „Dateien an Hand des Datums und der Uhrzeit finden“ habe ich gezeigt, wie man mit find Dateien eines bestimmten Zeitraums finden kann. Da ich aber für die Archivierung keine Rekursion benötige, kann ich das Ganze etwas einfacher mit einem Einzeiler machen:

stat -c '%n Date:%y' * | perl -n -e 'print "$1
" if /^(.+)sDate:2008/' \n | zip archiv_2008.zip -@

Ich verwende hier stat, um das Ausgabeformat bestimmen zu können. Da die Dateinamen Leerzeichen enthalten können, kann ich keine Leerzeichen als Trenner zwischen Name und Datum verwenden, daher die Kennzeichnung mittels „Date:“. Perl filtert mir erstens alle Dateien von 2008 heraus und gibt auch nur den Dateinamen aus. Zip liest diese von der Standardeingabe, wenn die Dateiliste als -@ angegeben ist.

Soll Zip die Dateien auch gleich entsorgen, so kann man das über die Option -m erreichen.

Artikel von Beta-Blogger nach WordPress umziehen

So, ich habe es geschafft, alle Artikel des alten Blog-Systems Beta-Blogger zu exportieren und diese in WordPress wieder zu importieren. Da ich keine direkte Übertragungsmöglichkeit gefunden habe, habe ich den Weg über CSV gewählt. Es gibt ein halbwegs brauchbares CSV-Import-Plugin und die Artikel aus dem alten Blog ließen sich mit dem folgenden PHP-Script als CSV exportieren:

<?php
require 'bb_core.php';

/* see http://de.php.net/manual/de/function.htmlentities.php#90111 */
function htmlButTags($str) {
  // Take all the html entities
  $caracteres = get_html_translation_table(HTML_ENTITIES);
  // Find out the "tags" entities
  $remover = get_html_translation_table(HTML_SPECIALCHARS);
  // Spit out the tags entities from the original table
  $caracteres = array_diff($caracteres, $remover);
  // Translate the string....
  $str = strtr($str, $caracteres);
  // And that's it!
  // oo now amps
  $str = preg_replace("/&(?![A-Za-z]{0,4}w{2,3};|#[0-9]{2,3};)/","&amp;" , $str);
  return $str;
}

$entries = $blog->get_items('entry', NULL, 1000) or print $lang->no_entries;

print("wp_title|wp_post_date|wp_category|wp_content|field1|field2|field3
");
foreach ($entries as $entry) {
  // Tags: Leerzeichen in "" ersetzen und " entfernen
  $tags =  preg_replace('/"(w+) (w+)"/', '$1=$2', $entry->tags);
  // Tags durch Kommata trennen
  $tags = str_replace(" ", ", ", $tags);
  // oben ersetzte Leerzeichen zurück wandeln
  $tags = str_replace("=", " ", $tags);
  $title = htmlButTags($entry->title);
  $date = strftime("%Y-%m-%d %T", $entry->date);
  $body = preg_replace('/
/', '&#x000A', htmlButTags($entry->body));
  $body = preg_replace('/src=["']media2/', 'src="/wp/wp-content/uploads/2009/09', $body);
  // Pipes müssen escaped werden
  $body = preg_replace('/|/', '|', $body);
  $body2 = preg_replace('/
/', '
', htmlspecialchars($entry->body));
  $teaser = htmlButTags($entry->topic);
  $category = htmlspecialchars($entry->category);

  print("$title|$date|$category|$body|$tags|$teaser|
");

}

?>

Damit die Leerzeichen, die beim Export mit ‚&#x000A‘ escaped wurden, beim Import entsprechend wieder hergestellt werden, musste ich das CSV-Import-Plugin noch geringfügig anpassen und eine Zeile einfügen:

$post_content = str_replace('&#x000A', "
", $post_content);

(Das komplette, angepasste Plugin gibt es hier.)

Leider kann das Import-Plugin keine Tags importieren. Ich habe diese daher im ersten Benutzerfeld abgelegt, so dass sie dann beim Editieren des Artikels per Cut & Paste in das Tag-Feld übertragen werden können. Das ist sicherlich nicht der Hit und bedeutet, dass man jeden Artikel anfassen muss. Aber bei 34 Artikeln ist das noch machbar.