Ergebnisdatei von findimagedupes weiternutzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Ergebnisdatei von findimagedupes weiternutzen

Beitrag von Kokopelli » 26.06.2012 11:46:47

Hallo zusammen,

lang lang ists her :)

Aber gut, hier zur aktuellen Problemstellung; Teillösungen habe ich finden können, aber da mir der Datenberg doch etwas zu wichtig ist würde ich lieber hier um hilfe fragen, mein scripting ist merklich eingerostet.

Die Situation (opional und ausführlich):
Eine 1TB große externe Festplatte hing an einem Mac und wurde als iPhoto Library genutzt. Natürlich ohne jedes Backup..
Die Platte versagt und landet bei mir. Testdisk konnte die Partition nicht retten, aber Photorec hat in einer knapp über 1wöchigen Prozedur alle Bilder einwandfrei wieder hergestellt.
Soweit, so gut, aber: Dabei sind sämtliche Bilder mindestens verdoppelt, teilweise 6-fach da, weil alle Thumbnails mit wiederhergestellt wurden. Insgesamt knapp 25.000 Dateien.
Tatsächlich byteweise identische Dateien konnte ich mit fdupes ausschliessen und löschen, da waren es wieder 1800 weniger.
Dann habe ich wo möglich den Dateinamen durch das Datum der exif-Infos ersetzt. Im Idealfall wäre ich hier fertig, aber es sind auch alte Bilder von alten frühen Digicams dabei, die keine Exif-tags geschrieben haben. Ebenso war bei denen die Auflösung ähnlich wie die der größeren thumbnails...
Auftritt findimagedupes. Großartig, was dieses Programm leistet, Bilder werden nach Bildinhalt(!) gruppiert, mit einer unglaublich guten Ergebnisqualität. Nach 1,5 Tagen hat geeqview dann auch die dabei erstellte Collection geöffnet und das Ergebnis ist toll. Alle zusammengehörigen Bilder wurden gefunden. Nun gilt es nur noch, diese auszusortieren... Womit wir beim Problem wären, 22.000 Bilder (wenn auch passend nach Dubletten gruppiert) sichten zu müssen. Auffällig ist, dass die jeweils größte Datei die gewünschte ist. Dabei ist das Ergebnis so gut, dass ich ein script nutzen möchte:



Das Problem (hier beginnt der spannende Teil)

gegeben:
-Eine Textdatei (ausgabe von findimagedupes) mit Dateinamen (voller Pfad)
-viele viele Zeilen
-mehrere Namen pro Zeile getrennt mit Leerzeichen
(diese zeigen alle auf Bilddateien, alle Dateien, die in einer Zeile stehen sind Dubletten voneinader)

gewünscht wäre folgendes Script:
-lies je alle Dateinamen pro Zeile ein
-kopiere je Zeile die Datei mit der größten Dateigröße in einen anderen Ordner
-wenn es in diesem (Zeilen-)set eine andere Datei gibt, deren Name mit 20 beginnt (d.h. Datum konnte aus exif-Info gelesen werden), kopiere auch diese
-ist all dies erledigt kopiere all die Dateien in den anderen Ordner, die im aktuellen Verzeichnis liegen und die nicht in der Datei genannt werden(diese haben dann keine Dubletten).


Falls gewünscht kann ich später einen WikiArtikel über die gesamte Rettungsaktion schreiben...
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Ergebnisdatei von findimagedupes weiternutzen

Beitrag von Cae » 26.06.2012 13:01:50

Ich bin so weit gekommen:

Code: Alles auswählen

#!/bin/sh
# BUGS:
# if 20* and biggest file -> copied twice

outdir=out/
indexfile=index
cp="echo cp "

while read line; do
	topsize=0
	top="$(echo "$line" | cut -d\  -f 1)" # if single file on line
	for file in $line; do
#		echo "D: file=$file"
		case "$(basename $file)" in
		    20*)
			$cp -a "$file" "$outdir"
			;;
		esac

		size="$(wc -c $file | cut -d\  -f 1)"
#		echo "D: $topsize, $size"
		if test $topsize -lt $size; then
			topsize=$size
		else
			top="$file"
		fi
	done
	$cp -a "$top" "$outdir"
done < "$indexfile"
Das ist die Testumgebung:

Code: Alles auswählen

~/tmp/img$ find . -type f | sort
./copy
./index
./raw/0-copy.jpg
./raw/0.jpg
./raw/1.jpg
./raw/20_0.jpg
./raw/20_2.jpg
./raw/20_8-copy.jpg
./raw/2.jpg
./raw/3.jpg
./raw/4-copy.jpg
./raw/4.jpg
./raw/5.jpg
./raw/6.jpg
./raw/7.jpg
./raw/8-copy.jpg
./raw/8.jpg
./raw/9.jpg
~/tmp/img$ cat index
raw/0-copy.jpg raw/0.jpg raw/20_0.jpg
raw/1.jpg
raw/20_2.jpg raw/2.jpg
raw/3.jpg
raw/4-copy.jpg raw/4.jpg
raw/5.jpg
raw/6.jpg
raw/7.jpg
raw/20_8-copy.jpg raw/8-copy.jpg raw/8.jpg
raw/9.jpg
Die Testdateien sind entweder leer oder enthalten "test":

Code: Alles auswählen

~/tmp/img$ file raw/*
raw/0-copy.jpg:    empty
raw/0.jpg:         ASCII text
raw/1.jpg:         ASCII text
raw/20_0.jpg:      empty
raw/20_2.jpg:      empty
raw/20_8-copy.jpg: empty
raw/2.jpg:         ASCII text
raw/3.jpg:         ASCII text
raw/4-copy.jpg:    empty
raw/4.jpg:         ASCII text
raw/5.jpg:         ASCII text
raw/6.jpg:         ASCII text
raw/7.jpg:         ASCII text
raw/8-copy.jpg:    empty
raw/8.jpg:         ASCII text
raw/9.jpg:         ASCII text
index wäre die Datei, die du hast (kann da ein "mein schreibtisch.jpg" vorkommen (whitespace?)). Einlesen geht, größenbasiertes Kopieren vielleicht auch, 20* wird kopiert. Für den letzten Punkte hatte ich keine Motivation mehr. ;)

Code: Alles auswählen

~/tmp/img$ ./copy 
cp -a raw/20_0.jpg out/
cp -a raw/20_0.jpg out/
cp -a raw/1.jpg out/
cp -a raw/20_2.jpg out/
cp -a raw/20_2.jpg out/
cp -a raw/3.jpg out/
cp -a raw/4-copy.jpg out/
cp -a raw/5.jpg out/
cp -a raw/6.jpg out/
cp -a raw/7.jpg out/
cp -a raw/20_8-copy.jpg out/
cp -a raw/8-copy.jpg out/
cp -a raw/9.jpg out/
Das würde passieren. Hinweis am Rande, $cp ist Absicht; das echo oben will für den scharfen Betrieb noch weggestrichen werden.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Ergebnisdatei von findimagedupes weiternutzen

Beitrag von uname » 26.06.2012 13:04:56

Ich würde einen Zwischenschritt durchführen und erst mal die Liste aus mehreren Einträgen pro Zeile auf einen Eintrag pro Zeile minimieren. In etwa so (ok, geht vielleicht auch mit einem awk-Einzeiler). Sei "liste.txt" deine genannte Liste mit hoffentlich absoluten Pfaden.

Code: Alles auswählen

#! /usr/bin/perl

$LISTE="liste.txt";

open(READ, "$LISTE") or die "Fehler bei Quelldatei $LISTE\n";
while (<READ>)
{ 
  $ent = $_;
  @werte = split (" ", $ent);
  $groesse = 0;
  $maxgroesse = 0;
  for ($i=0; $i<= $#werte; $i=$i+1)
  { 
    $groesse = -s $werte[$i];
    if ($groesse > $maxgroesse)
    { 
      $maxgroesse = $groesse;
      $maxfile = $werte[$i];
    }
  }
  print $maxfile . "\n";                                                                                                             
}

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Re: Ergebnisdatei von findimagedupes weiternutzen

Beitrag von Kokopelli » 26.06.2012 16:04:06

Soweit schon mal Danke an Euch, ich werde es alsbald möglich ausprobieren.

Zu den Nachfragen: Die Pfade sind absolut (in der Form /media/disk/rescue/xyz.jpg) und die Namen enthalten keine Leerzeichen.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

Benutzeravatar
Saxman
Beiträge: 4233
Registriert: 02.05.2005 21:53:52
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: localhost

Re: Ergebnisdatei von findimagedupes weiternutzen

Beitrag von Saxman » 26.06.2012 16:36:13

Kokopelli hat geschrieben:Hallo zusammen,

lang lang ists her :)
.
Und ich dachte mir schon, den kennst du doch... ;)

Willkommen zurück.
"Unix is simple. It just takes a genius to understand its simplicity." - Dennis Ritchie

Debian GNU/Linux Anwenderhandbuch | df.de Verhaltensregeln | Anleitungen zum Review und zum Verfassen von Wiki Artikeln.

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Re: Ergebnisdatei von findimagedupes weiternutzen

Beitrag von Kokopelli » 26.06.2012 21:24:18

Saxman hat geschrieben:
Kokopelli hat geschrieben:Hallo zusammen,

lang lang ists her :)
.
Und ich dachte mir schon, den kennst du doch... ;)

Willkommen zurück.
Danke, das ist ja ein netter Empfang hier :)
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

Antworten