• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Prüfsummen vergleichen und doppelte Dateien löschen

Hallo zusammen,

ich versuche gerade folgendes Problem zu lösen. Ich habe ca. 100.000 Dateien. Von diesen habe ich Prüfsummen erstellt. Das Ergebnis wurde in eine Textdatei exportiert und sieht z. B. wie folgt aus:

69022043f0faddd95c4b8cf49dcc0fc6 /home/nw017/temp/09180034B.JPG
008b775c8069561d74188b6cd6515fed /home/nw017/temp/09190001.JPG

Nun habe ich weitere 1000 Dateien, von denen ich nach gleichem Muster eine Prüfsummenliste erstellt habe:

410d6a5c19abbda98f32415777359ba4 /media/floppy 091gsgf02.JPG
1d9e2ddbade6f0f495c3f96b672e44e4 /media/floppy/09190bb4.JPG

Die Dateien stammen aus unterschiedlichen Ordnern und haben unterschiedliche Dateinamen. Jedoch gibt es Dateien, die absolut identisch sind und folglich die gleiche Prüfsumme haben.

FRAGE: Wie stelle ich es an, dass die Prüfsummen miteinander verglichen werden und die Dateien, die ich bereits habe, automatisch gelöscht werden?

MfG
 
Mit LINUX-Bordmitteln würde ich das wiefolgt lösen.
1. Sortierung aller Prüfsummen in temp1
2. Sortierung aller Prüfsummen ohne doppelte in temp2
3. Unterschiede zwischen temp1 und temp2 feststellen
4. Die entsprechenden Dateien löschen

Im Klartext heißt das:
Code:
sort -t " " -k 1,1 file*.txt > temp1.txt
sort -ut " " -k 1,1 file*.txt > temp2.txt
diff temp1.txt temp2.txt | grep '^<' | cut -c36- | while read file
do ls -l "$file"
done
Erst nachdem du dieses Teil getestet hast, würde ich den ls -l durch rm -f ersetzen.

Wenn du das öfters machst, würde ich ein performanteres perl-Script schreiben. Der while dürfte nämlich bei ein paar 1000 Dateien ein bisschen dauern... :wink:
 
Vielen Dank schonmal, bis auf den letzten Punkt läuft es wunderbar. Die Ausgabe von
diff temp1.txt temp2.txt | grep '^<' | cut -c37-
sieht schonmal so aus:
/home/nw017/temp/81c52d37da35004fd39a6c007cce9b53.png
/home/nw017/temp/07868c0a7b4912955059367ceae1cb35.png

Allerdings funktioniert der Rest irgendwie noch nicht. Wie bewerkstellige ich es nun, dass genau diese Dateien gelöscht werden? Mit dem while read bin ich irgendwie nicht klar gekommen.

MfG
 
groove schrieb:
Vielen Dank schonmal, bis auf den letzten Punkt läuft es wunderbar. Die Ausgabe von
diff temp1.txt temp2.txt | grep '^<' | cut -c37-
sieht schonmal so aus:
/home/nw017/temp/81c52d37da35004fd39a6c007cce9b53.png
/home/nw017/temp/07868c0a7b4912955059367ceae1cb35.png

Allerdings funktioniert der Rest irgendwie noch nicht. Wie bewerkstellige ich es nun, dass genau diese Dateien gelöscht werden? Mit dem while read bin ich irgendwie nicht klar gekommen.
Die Ausgabe, die aus cut herauskommt wird mit dem Pipe-Zeichen einer while-Schleife zugeführt. Diese Schleife liest Zeilenweise den Inhalt und legt in in der Umgebungsvariable $file ab. Dann sagst du ganz einfach innerhalb der Schleife ls -l $file.
Also nochmal:
Code:
diff temp1.txt temp2.txt | grep '^<' | cut -c37- | while read file; do ls -l $file; done
Die Strichpunkte kann man hierbei auch durch newlines ersetzen - wie in meinem ersten Beispiel.
 
Oben