Mittels bash und diff Duplikat-Bilder finden

von   Keine Kommentare

Wir nutzen eine Eye-Fi Karte, um Schnappschüsse, die wir im Alltag machen, direkt auf unseren zentralen Netzwerkspeicher übertragen zu bekommen. Also keinerlei händisches Speicherkarte in das Notebook stecken. Und v.a. werden die Bilder dadurch auch automatisch zeitnah im Backup gesichert.

Die Eye-Fi Karte bietet eine Funktion „endless Memory“ und realisiert das darüber, dass die ältesten Bilder auf der Karte automatisch gelöscht werden, wenn diese zuvor erfolgreich per Funk übertragen wurden. Natürlich geht das nur, wenn man die „Server“-Software unter Windows oder Mac laufen hat. Server in Anführungszeichen, da damit die Windows oder Mac-Software gemeint ist, in Ihrer Funktion, Bilder entgegenzunehmen aber in einer Server-Funktion arbeitet.

Ich nutze aber eben weder die Windows- noch die Mac-Software sondern das Rifec genannte Perl Skript, um es auf unserem „Server“, auch bekannt als Netbook, dauerhaft laufen zu haben. Somit entfällt die Funktion, Bilder auf der Karte zu löschen, da das seitens des Perl-Skripts nicht unterstützt wird.
Was bleibt ist also ein Datenbestand an Bildern auf der Eye-Fi Karte und die per Wlan übertragenen Bilder auf der Linux-Kiste.

Händisch will man das aber nicht unregelmäßig aussortieren, wenn man mal die Eye-Fi SD-Karte in das Netbook steckt. Daher habe ich mir ein kleines Bash-Skript geschrieben, was nach allen Bildern (bereinigt von „IMG_“ und „.JPG“-Dateiendung) des aktuellen Ordners in einem konfigurierten Verzeichnis sucht und jedes Suchergebnis mittels diff vergleicht. Standardmäßig spuckt es nur aus, ob Duplikate gefunden wurden und optional kann man die Bilder im Start-Ordner, der entweder die Eye-Fi Karte oder eben ein Temp-Ordner für auszusortierende Bilder ist, auch löschen lassen.

Da mit diff tatsächlich nur identische Dateien gefunden werden und ich die Funktionalität ausgiebig getestet habe, bin ich ziemlich sicher, dass wirklich nur Duplikate gelöscht werden. Daher steht als nächstes an, dass dieses Skript automatisch gestartet wird, wenn die Eye-Fi Karte eingesteckt wird.

Eine Erweiterung in der Zukunft könnte sein, statt simplem diff, den JPEG-Header zu ignorieren und mittels Jhead nur das Bild zwischenzuspeichern und dieses zu vergleichen, um auch Duplikate zu finden, die sich lediglich im Header (z.B. Uhrzeit-Anpassungen) unterscheiden.

Übrigens das Skript spuckt sogar in bunt aus, ob Duplikat oder nicht 😉

#!/bin/bash
PICPATH="/path/to/images"
LG="\033[01;32m"
LR="\033[01;31m"
CN="\033[00;00m"
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

param="$1"
for img in *.*
do
        echo -e "\n*** $img ***"
        img_number=`echo $img | sed -e "s/IMG_//gi" -e "s/\.JPG//gi"`
        dupe_found="no"
        for found in `find $PICPATH -iname "*$img_number*"`
        do
                diff -q "$img" "$found" > /dev/null
                if [ $? == 0 ]
                then
                        dupe_found="yes"
                        echo -e $LG"identisch:\t$CN $found"
                else
                        echo -e $LR"verschieden:\t$CN $found"
                fi
        done
        if [ "$dupe_found" == "yes" ]
        then
                echo "At least one dupe found. Executing 'rm $img'"
                if [ "$param" == "-d" ]
                then
                       echo "Deleting/rm ing $img"
                       rm $img
                else
                        echo "Only testing not deleted."
                fi
        fi
done
IFS=$SAVEIFS

Natürlich ist die Nutzung auf eigene Gefahr und ich übernehme gar nichts, sollte doch was falsches gelöscht werden 😉
Ein Hinweis noch: Das Skript muss natürlich in einem Ordner außerhalb des PICPATH gestartet werden, die zu untersuchenden potentiellen Duplikate dürfen sich also nicht innerhalb des PICPATH befinden, ansonsten werden natürlich genau die Bilder gefunden, nach denen man gerade suchen lässt…


Tags: , , , ,

Kommentar hinterlassen

 

_uacct = "UA-344406-1"; urchinTracker(); {lang: 'de'} var pkBaseURL = (("https:" == document.location.protocol) ? "https://cratoo.de/piwik/" : "http://cratoo.de/piwik/"); document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E")); try { var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 1); piwikTracker.trackPageView(); piwikTracker.enableLinkTracking(); } catch( err ) {}