Maxim Böckelmann

001: Duplikate finden und löschen

Ich stolperte eher zufällig über dieses Video:

Der Video-Anleitung folgend, und mit Hilfe von ChatGPT habe ich den Workflow etwas angepasst und getestet. Da ich vom Resultat begeistert bin und im Freundeskreis das Problem schon öfter an mich herangetragen wurde, wollte ich meine Lösung im Internet teilen. Sie ist vielleicht nicht die schnellste (cksum und md5 wurden in den Kommentaren des Original-Posts verglichen). Meine Änderung, dass die mindeste Dateigröße 1 Byte ist, und nicht 1 MB, wie im Video, wird den Vorgang bei riesigen Dateimassen sicher verlangsamen. Aber für mich funktioniert dieser Workflow. Das Löschen der Duplikate folgt auch keiner besonderen Logik wie "erkenne ob die Originale in einem Ordner sind, also einzeln herumliegende Dateien anderswo das Duplikat sein müssen". Es tut wirklich nur die beiden Dinge im Titel dieses Blogposts: Duplikate finden (und temporär auflisten), diese Liste untersuchend die Duplikate zur Löschung vorschlagen und nach Bestätigung löschen.

Hier also der Ablauf:

(Hinweis: /Pfad/zum/großen/Datei/Müllhaufen und DEINNUTZERNAME sind entsprechend eurem System zu ersetzen. Getestet habe ich dies mit MacOS Sonoma 14.4)

1: Gehe im Terminal zum Ordner, in dem alle Dateien sind, die untersucht werden sollen:

cd /Pfad/zum/großen/Datei/Müllhaufen

2: Führe diesen "one-liner" aus:

(Finde Dateien vom Typ Datei, die größer sind als 1 Byte und lass cksum ohne Parameter laufen. Tue beides danach: 1) schreib das Ergebnis in eine temporäre Datei und 2) trenne Checksumme und Dateigröße mit einem Leerzeichen. Paare alle gleichen Checksummen und sortiere danach die gesamte Liste nach Dateigröße (größte Dateien zuerst). Gib diesen Output in eine Datei auf dem Schreibtisch und lösche die temporäre Datei.)

find . -type f -size +1c -exec cksum {} \; | tee /tmp/filelist.tmp | cut -f 1,2 -d ' ' | sort | uniq -d | grep -hif - /tmp/filelist.tmp | sort -nrk2 > /Users/DEINNUTZERNAME/Desktop/output.txt; rm /tmp/filelist.tmp

3: Speichere im /Pfad/zum/großen/Datei/Müllhaufen folgendes Shell-Skript:

#!/bin/bash

# Pfad zur output.txt-Datei
OUTPUT_FILE="/Users/DEINNUTZERNAME/Desktop/output.txt"

# Überprüfen, ob die output.txt-Datei existiert
if [ ! -f $OUTPUT_FILE ]; then
    echo "Die Datei $OUTPUT_FILE existiert nicht."
    exit 1
fi

echo "Überprüfung auf Duplikate..."

# Vorherige Checksumme und Dateigröße initialisieren
prev_checksum=""
prev_size=""

# Zeilenweise durch die Datei gehen
while read -r line; do
    # Lese Checksumme, Dateigröße und Pfad für jede Zeile
    read checksum size path <<<$(echo $line)

    # Überprüfen, ob wir bei einer neuen Gruppe von Dateien sind
    if [[ "$checksum" != "$prev_checksum" || "$size" != "$prev_size" ]]; then
        # Neue Gruppe, also setzen wir diese Datei als "Original" und überspringen das Löschen
        echo "Original gefunden: $path"
        prev_checksum=$checksum
        prev_size=$size
    else
        # Wir haben ein Duplikat gefunden
        echo "Duplikat gefunden: $path"
        # Duplikat zur Löschliste hinzufügen
        duplicates+=("$path")
    fi
done < "$OUTPUT_FILE"

# Abfrage, ob die gefundenen Duplikate gelöscht werden sollen
if [ ${#duplicates[@]} -gt 0 ]; then
    echo "Folgende Duplikate wurden gefunden und können gelöscht werden:"
    printf "%s\n" "${duplicates[@]}"
    read -p "Möchten Sie diese Duplikate löschen? (JA zum Löschen): " confirmation

    if [[ $confirmation == "JA" ]]; then
        # Duplikate löschen
        for path in "${duplicates[@]}"; do
            rm "$path"
            echo "$path wurde gelöscht."
        done
    else
        echo "Vorgang abgebrochen."
    fi
else
    echo "Keine Duplikate zum Löschen gefunden."
fi

4: Mache das Skript ausführbar:

chmod +x DeinSkript.sh

5: Führe das Skript aus:

./DeinSkript.sh

Die temporäre Datei ist schon gelöscht worden, die output.txt auf dem Schreibtisch muss man noch manuell löschen.

Wichtig: Ich empfehle dringend vorher ein komplettes Backup zu machen, da der Lösch-Vorgang permanent ist, also die Dateien nicht im Papierkorb landen.

💾 Archiv