Darktable – Datenbankbereinigung

Send to Kindle
Darktable - Datenbankbereinigung

Darktable – Datenbankbereinigung

Seit längerem verwende ich sowohl unter Linux als auch OS X den RAW-Konverter Darktable. Das Programm ist wirklich extrem leistungsfähig. Die Möglichkeit, Filter mehrfach anzuwenden und mit verschiedenen Ebenenmodi verrechnen zu können, eröffnet Möglichkeiten, die ansonsten nur in Grafikprogrammen wie etwa GIMP oder Photoshop offenstehen.

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.

Über kurz oder lang wird es notwendig, die verwaisten Einträge zu bereinigen. Dazu muss sqlite3 installiert sein, welches sich über die Repositories leicht nachholen lässt, sollte das Paket nicht bereits installiert sein. 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.