Darktable - Datenbankbereinigung

Darktable – Datenbankbereinigung

Darktable speichert seine Metadaten in einer dedizierten Datenbank. Löscht oder verschiebt man nun Verzeichnisse auf der Kommandozeile oder mittels irgendeines Dateimanagers, so kommt es zu verwaisten Datenbankeinträgen in der Darktable-Datenbank. Wie beim alljährlicher Frühjahrsputz, sollte man auch hier ein wenig für Sauberkeit sorgen – so behält Darktable den Durchblick.

Darktable speichert seine Metadaten in einer dedizierten Datenbank. Löscht oder verschiebt man nun Verzeichnisse auf der Kommandozeile oder mittels irgendeines Dateimanagers, so kommt es zu verwaisten Datenbankeinträgen in der Darktable-Datenbank. Wie beim alljährlicher Frühjahrsputz, sollte man auch hier ein wenig für Sauberkeit sorgen – so behält Darktableden Durchblick.

Über kurz oder lang wird es notwendig, die verwaisten Einträge zu bereinigen. Dazu muss sqlite3 installiert sein, welches sich über die Repositories (Linux) leicht nachholen lässt, sollte das Paket nicht bereits installiert sein. Auch unter OSX/macOS ist sqlite3 i.d.R. bereits vorhanden. Das folgende Shell-Skript, welches ich von https://github.com/darktable-org/darktable/blob/master/tools/purge_non_existing_images.sh  habe, sorgt dafür, dass die verwaisten Datenbankeinträge gelöscht werden.

Die hier abgedruckte Version habe ich zum besseren Verständnis kommentiert, so dass Sie erkennen können, was das Skript im Einzelnen macht.

#!/bin/sh
# 
# Loeschen von verwaisten Eintraegen in der Datrktable-Datenbank
# 
# Original-Skript:
# https://github.com/darktable-org/darktable/blob/master/tools/purge_non_existing_images.sh
#
DB=~/.config/darktable/library.db
TMP=`mktemp -t tmp.XXXXXXXXXX`
# Alle in der Datenbank gespeicherten Bilder mit Dateiname und Filmrolle
# abfragen und Ergebnis temporaer speichern
SQL="select A.id,B.folder,A.filename from images as A join film_rolls as B on A.film_id = B.id"
sqlite3 $DB "$SQL" > $TMP
# Ergebnis ausgeben und analysieren ...
cat $TMP | while read DATASET
do
  ID=$(echo "$DATASET"   | cut -f1 -d"|")  # ID ausschneiden
  DIR=$(echo "$DATASET"  | cut -f2 -d"|")  # Verzeichnis ausschneiden
  FILE=$(echo "$DATASET" | cut -f3 -d"|")  # Dateiname ausschneiden
  # wenn Verzeichnis/Datei nicht existiert, dann Eintrag loeschen
  if ! [ -f "$DIR/$FILE" ];
  then
    echo "Entferne fehlendes Bild $DIR/$FILE mit der ID = $ID aus Datenbank."
    for table in images meta_data; do
      sqlite3 "$DB" "delete from $table where id=$ID"
    done
    for table in color_labels history mask selected_images tagged_images; do
      sqlite3 "$DB" "delete from $table where imgid=$ID"
    done
  fi
done
rm $TMP

# loesche die Filmrollen, die jetzt evtl. leer sind
sqlite3 "$DB" "DELETE FROM film_rolls WHERE (SELECT COUNT(A.id) FROM images AS A WHERE A.film_id=film_rolls.id)=0"

Um das Skript zu nutzen, kopieren Sie es in ihr persönlichen Ausführungsverzeichnis und versehen es mit Ausführungsrechten. Danach reicht es, das Skript einfach aufzurufen.

Hinweis: Das Beitragsbild wurde natürlich (im Nachhinein) in Darktable bearbeitet, auch wenn es mittlerweile, wie man an den Kameradaten erkennen kann, schon etwas älter ist und es damals noch kein Darktable gab.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.