Zum Finden von Duplikaten gibt es unter Linux das mächtige Tool fdupes
.
fdupes
durchsucht vorgegebene Verzeichnisse und sucht Dateien mit gleichen Hash-Wert. Werden Dateien mit gleichen Hash-Wert gefunden, werden diese noch bitweise mit einander verglichen.
fdupes
ist in den Debian-Repositories vorhanden und kann mit aptitude install fdupes
installiert werden.
Hinweis:
Diese Anleitung bezieht sich auf die Verison fdupes 1.50-PR2-3
, welche z.B.: in Debian Squeeze enthalten ist.
Leider wurde der Parameter <code -L in den darauffolgenden Versionen wieder entfernt, da er Probleme verurschte, wenn fdupes über mehrere Partitionen/Laufwerke verwendet wurde.
Ein Beispiel:
Im folgenden Beispiel wurden 2 Dateien (File1.txt und File2.txt) erzeugt.
Von File1.txt gibt es 2 Kopien und von File2.txt gibt es eine Kopie im gleichen Verzeichnis. Desweiteren wurden alle „Kopie“-Dateien auch in das Unterverzeichnis „anderer_ort“ kopiert.
Ein ausführen von
1 |
#> fdupes ./ |
ergibt folgendes Ergebnis:
1 2 3 4 5 6 |
./File1.txt ./File1-Kopie1.txt ./File1-Kopie2.txt ./File2.txt ./File2-Kopie1.txt |
Mit dem Parameter -r
(recursive in alle ab Suchpfand vorhandenen Unterverzeichnissen) ergibt sich folgende Ausgabe.
1 2 3 4 5 6 7 8 9 10 |
#> fdupes ./ -r ./File1.txt ./File1-Kopie1.txt ./File1-Kopie2.txt ./anderer_ort/File1-Kopie2.txt ./anderer_ort/File1-Kopie1.txt ./File2.txt ./File2-Kopie1.txt ./anderer_ort/File2-Kopie1.txt |
Mit dem zusätzlichen Parameter -f
(weglassen des ersten Treffers) ergibt sich folgende Ausgabe.
1 2 3 4 5 6 7 8 |
#> fdupes -r -f ./File1-Kopie1.txt ./File1-Kopie2.txt ./anderer_ort/File1-Kopie2.txt ./anderer_ort/File1-Kopie1.txt ./File2-Kopie1.txt ./anderer_ort/File2-Kopie1.txt |
Mit dem Parameter -m
(Zusammenzählen der Dateigrößen) wird ausgegeben, wieviel Platz durch doppelte Dateien belegt werden.
1 2 |
#> fdupes ./ -r -m 6 duplicate files (in 2 sets), occupying 130 bytes. |
Mit dem Parameter -d
werden doppelte Dateien mit Rückfrage gelöscht (Parameter können auch einfach aneiander geschrieben werden).
1 2 3 4 5 6 7 8 |
#> fdupes ./ -rd [1] ./File1.txt [2] ./File1-Kopie1.txt [3] ./File1-Kopie2.txt [4] ./anderer_ort/File1-Kopie2.txt [5] ./anderer_ort/File1-Kopie1.txt Set 2 of 2, preserve files [1 - 5, all]: |
Man kann nun auswählen, welche Datei man behalten möchte (1-5). Alle anderen Files werden gelöscht. Mit der Angabe von „all“ werden alle Dateien behalten.
In diesem Fall wählen wir die 1. Datei aus (Eingabe: 1)
1 2 3 4 5 6 7 |
Set 1 of 1, preserve files [1 - 5, all]: 1 [+] ./File1.txt [-] ./File1-Kopie1.txt [-] ./File1-Kopie2.txt [-] ./anderer_ort/File1-Kopie2.txt [-] ./anderer_ort/File1-Kopie1.txt |
Die Datei mit dem „[+]“ wird behalten, alle anderen Dateien ( [-] ) werden glöscht.
Diese Frage kommt bei jeden Treffer von doppelt vorhandenen Dateien.
Ein Löschen ohne Nachfrage erfolgt mit dem Parameter -N
. Mit Verwendung dieses Parameters -N
wird immer der erste Treffer erhalten und alle anderen Dateien gelöscht.
ACHTUNG: Die erste Datei, welche fdupes
annimmt, ist nicht immer auch die Datei, welche man erhalten möchte.
Wesentlich „ungefährlicher“ ist da die Verwendung des Parameters -L
(erstellt Hardlinks anstatt zu löschen).
Dieser Parameter ist z.B.: in fdupes 1.50-PR2 vorhanden.
1 2 3 4 5 6 7 8 9 10 |
#> fdupes ./ -rL [+] ./anderer_ort/File2-Kopie1.txt [h] ./File2-Kopie1.txt [h] ./File2.txt [+] ./File1-Kopie2.txt [h] ./anderer_ort/File1-Kopie2.txt [h] ./anderer_ort/File1-Kopie1.txt [h] ./File1.txt [h] ./File1-Kopie1.txt |
Das „[L]“ gibt an, dass die Datei nun durch Hardlinks verbunden wurden. Dadurch ist die Datei noch in allen Verzeichnissen erhalten, belegt aber nur einmal den Speicherplatz dafür.
Man erkennt das an den Inodes der Dateien.
(Vor fdupes ./ -rL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#> ls -liR .: insgesamt 24 83 drwxr-xr-x 2 root root 4096 12. Okt 10:38 anderer_ort 96 -rw-r--r-- 1 root root 20 12. Okt 10:38 File1-Kopie1.txt 85 -rw-r--r-- 1 root root 20 12. Okt 10:38 File1-Kopie2.txt 95 -rw-r--r-- 1 root root 20 12. Okt 10:38 File1.txt 86 -rw-r--r-- 1 root root 25 12. Okt 10:38 File2-Kopie1.txt 87 -rw-r--r-- 1 root root 25 12. Okt 10:38 File2.txt ./anderer_ort: insgesamt 12 79 -rw-r--r-- 1 root root 20 12. Okt 10:38 File1-Kopie1.txt 77 -rw-r--r-- 1 root root 20 12. Okt 10:38 File1-Kopie2.txt 78 -rw-r--r-- 1 root root 25 12. Okt 10:38 File2-Kopie1.txt |
(Nach fdupes ./ -rL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#> ls -liR .: insgesamt 24 83 drwxr-xr-x 2 root root 4096 12. Okt 10:39 anderer_ort 85 -rw-r--r-- 5 root root 20 12. Okt 10:38 File1-Kopie1.txt 85 -rw-r--r-- 5 root root 20 12. Okt 10:38 File1-Kopie2.txt 85 -rw-r--r-- 5 root root 20 12. Okt 10:38 File1.txt 78 -rw-r--r-- 3 root root 25 12. Okt 10:38 File2-Kopie1.txt 78 -rw-r--r-- 3 root root 25 12. Okt 10:38 File2.txt ./anderer_ort: insgesamt 12 85 -rw-r--r-- 5 root root 20 12. Okt 10:38 File1-Kopie1.txt 85 -rw-r--r-- 5 root root 20 12. Okt 10:38 File1-Kopie2.txt 78 -rw-r--r-- 3 root root 25 12. Okt 10:38 File2-Kopie1.txt |
Während vorher alle Dateien eine eigene Inode hatten (erste Spalte), haben nun mehrere Dateien die gleiche Inode. Sie verweisen demnach alle auf die gleiche Datei.
Eine Datei mit mehreren Hardlinks existiert solange mindestens ein Verweis auf diese Datei vorhanden ist. Es ist demnach egal welche Datei man löscht; es gibt keine „Haupt“-Datei wie z.B.: bei symbolischen Links.
Die Gefahr von Hardlinks.
Hardlinks verweisen immer auf die gleiche Datei. Es ist somit egal von welchen Verzeichnis man auf die Datei zugreift, Änderungen an der Datei sind immer für alle Links gültig.
Man sollte vorsichtig sein, wann man Hardlinks einsetzt.
Wenn man eine Musiksammlung hat, in denen gleiche Musikstücke (gleich in den Bits!) mehrfach vorhanden sind weil diese z.B.: auf mehreren Sampler-CD´s angeboten werden, kann man Hardlinks durchaus verwenden um Fesplattenplatz zu sparen.
Gleiches Gilt z.B.: auch für Fotosammlungen.
In beiden Fällen würde man ein Musikfile oder Bild nicht ändern oder, wenn man es ändert, unter einen neuen Namen abspeichern.
Problematisch wird es, wenn man mehrere Stände von Projekt-Dateien abspeichert, um eine Histoire eines Projektes zu haben. Zwar würden auch hier alle doppelten Dateien verlinkt, aber es kann vorkammen, dass man eine solche Datei in einer aktuellen Projekt-Version ändert. In diesen Fall würde diese Datei aber auch in allen vorherig abgespeichterten Versionen geändert. Somit wäre zuvor abgespeicherten Projekt-Stände verfälscht, da sie nicht dem ursprünglichen Stand entsprechen.