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...
Ergebnisdatei von findimagedupes weiternutzen
Ergebnisdatei von findimagedupes weiternutzen
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
Re: Ergebnisdatei von findimagedupes weiternutzen
Ich bin so weit gekommen:
Das ist die Testumgebung:
Die Testdateien sind entweder leer oder enthalten "test":
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.
Das würde passieren. Hinweis am Rande, $cp ist Absicht; das echo oben will für den scharfen Betrieb noch weggestrichen werden.
Gruß Cae
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"
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
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
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/
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
Re: Ergebnisdatei von findimagedupes weiternutzen
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";
}
Re: Ergebnisdatei von findimagedupes weiternutzen
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.
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)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
- Saxman
- Beiträge: 4233
- Registriert: 02.05.2005 21:53:52
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: localhost
Re: Ergebnisdatei von findimagedupes weiternutzen
Und ich dachte mir schon, den kennst du doch...Kokopelli hat geschrieben:Hallo zusammen,
lang lang ists her
.
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.
Debian GNU/Linux Anwenderhandbuch | df.de Verhaltensregeln | Anleitungen zum Review und zum Verfassen von Wiki Artikeln.
Re: Ergebnisdatei von findimagedupes weiternutzen
Danke, das ist ja ein netter Empfang hierSaxman hat geschrieben:Und ich dachte mir schon, den kennst du doch...Kokopelli hat geschrieben:Hallo zusammen,
lang lang ists her
.
Willkommen zurück.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)