Finden Sie doppelte Dateien

90

Ist es möglich, doppelte Dateien auf meiner Festplatte zu finden, die Bit für Bit identisch sind, aber unterschiedliche Dateinamen haben?

Student
quelle
3
Beachten Sie, dass jede mögliche Methode dazu immer jede einzelne Datei auf Ihrem System mit jeder anderen Datei vergleichen muss . Das wird also lange dauern , auch wenn Sie Verknüpfungen verwenden.
Shadur
4
@Shadur Wenn man mit Prüfsummen einverstanden ist, läuft es darauf hinaus, nur die Hashes zu vergleichen - was auf den meisten Systemen in der Größenordnung von 10 ^ (5 + -1) liegt, normalerweise <64-Byte-Einträge. Natürlich müssen Sie die Daten mindestens einmal lesen. :)
Peterph
15
@ Shadur Das stimmt nicht. Sie können die Zeit verkürzen, indem Sie nach passenden st_sizes suchen, diejenigen mit nur einem der gleichen entfernen und dann nur md5sums für passende st_sizes berechnen .
Chris Down
6
@Shadur selbst ein unglaublich alberner Ansatz, der keine Hash-Operationen zulässt, könnte dies tun, wenn compar (n log n) - nicht Θ (n²) - mit einem von mehreren Sortieralgorithmen (basierend auf dem Dateiinhalt) verglichen wird.
Derobert
1
@ ChrisDown Ja, die Größenanpassung wäre eine der Abkürzungen, die ich mir vorgestellt hatte.
Shadur

Antworten:

104

fdupeskann dies tun. Von man fdupes:

Durchsucht den angegebenen Pfad nach doppelten Dateien. Solche Dateien werden durch Vergleichen der Dateigrößen und der MD5-Signaturen, gefolgt von einem Byte-für-Byte-Vergleich, gefunden.

In Debian oder Ubuntu können Sie es mit installieren apt-get install fdupes. In Fedora / Red Hat / CentOS können Sie es mit installieren yum install fdupes. Unter Arch Linux können Sie pacman -S fdupesund unter Gentoo emerge fdupes.

Verwenden Sie zum Ausführen einer Überprüfung, die von Ihrem Dateisystemstamm abstammt und wahrscheinlich viel Zeit und Speicher benötigt, Folgendes fdupes -r /:

Wie in den Kommentaren angefordert, können Sie die größten Duplikate erhalten, indem Sie folgendermaßen vorgehen:

fdupes -r . | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n

Dies wird unterbrochen, wenn Ihre Dateinamen Zeilenumbrüche enthalten.

Chris Down
quelle
Vielen Dank. Wie kann ich den größten Betrug herausfiltern? Wie kann ich die Größen lesbar machen?
Student
@student: Verwenden Sie etwas in der Art von (stellen Sie sicher, dass fdupes nur die Dateinamen ohne zusätzliche Informationen ausgibt oder ausschneidet oder sediert, um diese beizubehalten): Belassen Sie fdupes ....... | xargs ls -alhd | egrep 'M |G 'Dateien im vom Menschen lesbaren Format und nur solche mit einer Größe in Megabyte oder Gigabyte. Ändern Sie den Befehl entsprechend den tatsächlichen Ausgaben.
Olivier Dulac
2
@OlivierDulac Sie sollten niemals ls analysieren . Normalerweise ist es schlimmer als Ihr Anwendungsfall, aber selbst in Ihrem Anwendungsfall riskieren Sie falsch positive Ergebnisse.
Chris Down
@student - Sobald Sie die Dateinamen haben, werden Sie durch eine duPipeline darauf hingewiesen sort.
Chris Down
@ ChrisDown: Es ist wahr, es ist eine schlechte Angewohnheit und kann falsch positive Ergebnisse liefern. Aber in diesem Fall (interaktive Verwendung und nur zur Anzeige, kein "rm" oder etwas der Art, das sich direkt darauf verlässt) ist es gut und schnell ^^. Ich liebe diese Seiten, auf die Sie verlinken, übrigens (ich lese sie seit ein paar Monaten und stecke voller nützlicher Informationen)
Olivier Dulac
26

Ein weiteres gutes Werkzeug ist fslint:

fslint ist ein Toolset zum Auffinden verschiedener Probleme mit Dateisystemen, einschließlich doppelter Dateien und problematischer Dateinamen usw.

Zusätzlich zur Benutzeroberfläche stehen einzelne Befehlszeilentools zur Verfügung. Um darauf zuzugreifen, können Sie bei einer Standardinstallation das Verzeichnis / usr / share / fslint / fslint in $ PATH ändern oder hinzufügen. Jeder dieser Befehle in diesem Verzeichnis verfügt über die Option --help, mit der die Parameter näher erläutert werden.

   findup - find DUPlicate files

Auf Debian-basierten Systemen können Sie es installieren mit:

sudo apt-get install fslint

Sie können dies auch manuell tun, wenn Sie Tools von Drittanbietern nicht installieren möchten oder können. Die meisten dieser Programme arbeiten mit der Berechnung von Dateiprüfsummen . Dateien mit derselben MD5-Summe enthalten mit ziemlicher Sicherheit genau dieselben Daten. Sie könnten also so etwas tun:

find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 

Beispielausgabe (die Dateinamen in diesem Beispiel sind identisch, funktionieren jedoch auch, wenn sie unterschiedlich sind):

$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
 /usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---

Dies ist viel langsamer als die bereits erwähnten dedizierten Tools, funktioniert jedoch.

terdon
quelle
4
Es wäre viel, viel schneller, Dateien zu finden, die dieselbe Größe wie eine andere Datei haben st_size, alle zu entfernen, die nur eine Datei dieser Größe haben, und dann md5-Summen nur zwischen Dateien mit derselben Größe zu berechnen st_size.
Chris Down
@ ChrisDown ja, wollte es einfach halten. Was Sie vorschlagen, wird die Dinge natürlich erheblich beschleunigen. Deshalb habe ich den Haftungsausschluss, dass es am Ende meiner Antwort langsam ist.
Terdon
8

Kurze Antwort: ja.

Längere Version: Schauen Sie sich den Wikipedia- Eintrag fdupes an , er enthält eine schöne Liste fertiger Lösungen. Natürlich können Sie Ihre eigenen schreiben, es ist nicht , dass schwer - Hashing - Programme wie diff, sha*sum, find, sortund uniqdie Arbeit machen sollte. Sie können es sogar in eine Zeile setzen, und es wird immer noch verständlich sein.

peterph
quelle
6

Wenn Sie glauben, dass eine Hash-Funktion (hier MD5) in Ihrer Domain kollisionsfrei ist:

find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
 | cut --characters=35-

Möchten Sie identische Dateinamen gruppieren? Schreiben Sie ein einfaches Skript, not_uniq.shum die Ausgabe zu formatieren:

#!/bin/bash

last_checksum=0
while read line; do
    checksum=${line:0:32}
    filename=${line:34}
    if [ $checksum == $last_checksum ]; then
        if [ ${last_filename:-0} != '0' ]; then
            echo $last_filename
            unset last_filename
        fi
        echo $filename
    else
        if [ ${last_filename:-0} == '0' ]; then
            echo "======="
        fi
        last_filename=$filename
    fi

    last_checksum=$checksum
done

Dann ändern Sie den findBefehl, um Ihr Skript zu verwenden:

chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh

Das ist die Grundidee. Wahrscheinlich sollten Sie ändern, findwenn Ihre Dateinamen einige Zeichen enthalten. (zB Leerzeichen)

xin
quelle
6

Ich habe mir überlegt, eine neue, verbesserte FDUPE- Gruppe , jdupes, hinzuzufügen , die verspricht, schneller und funktionsreicher zu sein als fdupes (z. B. Größenfilter):

jdupes . -rS -X size-:50m > myjdups.txt

Dies findet rekursiv duplizierte Dateien, die größer als 50 MB sind, im aktuellen Verzeichnis und gibt die Ergebnisliste in myjdups.txt aus.

Beachten Sie, dass die Ausgabe nicht nach Größe sortiert ist. Da sie offenbar nicht integriert ist, habe ich die @ Chris_Down-Antwort oben angepasst, um dies zu erreichen:

jdupes -r . -X size-:50m | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n > myjdups_sorted.txt
Sebastian Müller
quelle
Hinweis: Die neueste Version von jdupes unterstützt das Abgleichen von Dateien mit nur einem Teil-Hash, anstatt darauf zu warten, dass das Ganze gehasht wird. Sehr hilfreich. (Sie müssen das Git-Archiv klonen, um es zu erhalten.) Hier ist die Option, die ich gerade verwende: jdupes -r -T -T --exclude = size-: 50m --nohidden
Benjamin
2

Wikipedia hatte einen Artikel ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ) mit einer Liste verfügbarer Open-Source-Software für diese Aufgabe, der jetzt jedoch gelöscht wurde .

Ich werde hinzufügen, dass die GUI-Version von fslint sehr interessant ist und es erlaubt, mithilfe der Maske auszuwählen, welche Dateien gelöscht werden sollen. Sehr nützlich, um doppelte Fotos zu säubern.

Unter Linux können Sie Folgendes verwenden:

- FSLint: http://www.pixelbeat.org/fslint/

- FDupes: https://en.wikipedia.org/wiki/Fdupes

- DupeGuru: https://www.hardcoded.net/dupeguru/

Die 2 letzten Arbeiten auf vielen Systemen (Windows, Mac und Linux) habe ich nicht auf FSLint überprüft

MordicusEtCubitus
quelle
5
Es ist besser, hier tatsächliche Informationen bereitzustellen und nicht nur einen Link, der Link könnte sich ändern und die Antwort hat keinen Wert mehr
Anthon
2
Die Wikipedia-Seite ist leer.
ihor_dvoretskyi
Ja, es wurde gereinigt, wie schade, schütteln ...
MordicusEtCubitus
Ich habe es mit diesen 3 Werkzeugen bearbeitet
MordicusEtCubitus
0

Hier ist meine Meinung dazu:

find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
  echo -n '.'
  if grep -q "$i" md5-partial.txt; then echo -e "\n$i  ---- Already counted, skipping."; continue; fi
  MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
  MD5=`echo $MD5 | cut -d' ' -f1`
  if grep "$MD5" md5-partial.txt; then echo "\n$i  ----   Possible duplicate"; fi
  echo $MD5 $i >> md5-partial.txt
done

Der Unterschied besteht darin, dass nur die ersten 1 MB der Datei gehasht werden.
Dies hat einige Probleme / Funktionen:

  • Es könnte einen Unterschied nach den ersten 1 MB geben, so dass das Ergebnis eher ein Kandidat zum Überprüfen ist. Ich könnte das später beheben.
  • Das Überprüfen der Dateigröße kann dies beschleunigen.
  • Nimmt nur Dateien auf, die größer als 3 MB sind.

Ich benutze es, um Videoclips zu vergleichen, das reicht mir also.

Ondra Žižka
quelle