Entfernen von Dateien mit doppeltem Inhalt aus einem einzelnen Verzeichnis [Perl oder Algorithmus]

7

Ich habe einen Ordner mit einer großen Anzahl von Dateien, von denen einige genau denselben Inhalt haben. Ich möchte Dateien mit doppeltem Inhalt entfernen. Wenn zwei oder mehr Dateien mit doppeltem Inhalt gefunden werden, möchte ich eine dieser Dateien zurücklassen und die anderen löschen.

Folgendes habe ich mir ausgedacht, aber ich weiß nicht, ob es funktioniert :), habe es noch nicht probiert.

Wie würdest du das machen? Perl oder allgemeiner Algorithmus.

%Vor%     
flamey 17.11.2009, 07:01
quelle

9 Antworten

6

Perl, mit Digest :: MD5-Modul.

%Vor%

Wenn Perl kein Muss ist und Sie an * nix arbeiten, können Sie Shell-Tools verwenden

%Vor%     
ghostdog74 17.11.2009, 08:06
quelle
8

Hier ist ein allgemeiner Algorithmus (der jetzt aus Effizienzgründen editiert wurde - und ich habe auch einen Fehler behoben, den niemand gemeldet hat):)

Es wird ewig dauern (ganz zu schweigen von viel Speicher), wenn ich den Inhalt jeder einzelnen Datei mit jedem anderen vergleichen werde. Warum wenden wir nicht die gleiche Suche zuerst auf ihre Größe an und vergleichen dann die Prüfsummen für die Dateien gleicher Größe.

Also wenn wir (siehe Digest :: MD5 ) berechnen Sie ihre Größe, wir können eine Hash-Tabelle verwenden, um unser Matching für uns durchzuführen und die Übereinstimmungen in arrayrefs zu speichern:

%Vor%

Jetzt müssen wir nur die potentiellen Duplikate herausziehen und prüfen, ob sie identisch sind (indem wir für jede eine Prüfsumme erstellen, indem wir Digest :: MD5 ), mit der gleichen Hash-Technik:

%Vor%

-Fini

    
Ether 17.11.2009 07:42
quelle
6
%Vor%     
Rudedog 17.11.2009 07:13
quelle
1

Variationen über ein Thema:

%Vor%

Es ist nicht nötig, eine Liste zu führen, nur um sie aus der Liste zu entfernen und den Rest zu löschen; Behalte einfach das, was du vorher gesehen hast, und entferne alle Dateien, die einer bereits gesehenen Summe entsprechen. Die 2-Limit-Aufteilung soll das Richtige mit Dateinamen machen, die Leerzeichen enthalten.

Wenn Sie dem nicht trauen, ändern Sie einfach das Wort unlink in print und es wird eine Liste der zu entfernenden Dateien ausgegeben. Sie können diese Ausgabe sogar in eine Datei umwandeln und dann am Ende rm $(cat to-delete.txt) , wenn es gut aussieht.

    
hobbs 17.11.2009 07:35
quelle
0

In diesem Fall ist ein Bash-Skript ausdrucksstarker als Perl:

%Vor%     
catwalk 17.11.2009 08:52
quelle
0

Ich würde empfehlen, dass Sie es in Perl machen und File :: Find verwenden, während Sie es sind daran.
Wer weiß, was Sie tun, um Ihre Dateiliste zu erstellen, aber Sie können es mit Ihrer Dublettenprüfung kombinieren.

%Vor%     
dlamblin 17.11.2009 08:10
quelle
0

Hier ist eine Möglichkeit, zuerst nach Größe und dann nach md5 checksum zu filtern:

%Vor%     
Sinan Ünür 17.11.2009 12:47
quelle
0

Perl ist ein bisschen übertrieben dafür:

%Vor%

(Wenn Sie einige dieser Hilfsprogramme vermissen oder diese Flags / Funktionen nicht haben, Installieren Sie GNU findutils und coreutils.)

    
ysth 17.11.2009 08:21
quelle
-2

Vielleicht möchten Sie einen Blick darauf werfen, wie ich doppelte Dateien gefunden und entfernt habe. Obwohl Sie es an Ihre Bedürfnisse anpassen müssen.

Ссылка

    
Priyank Bolia 17.11.2009 07:39
quelle

Tags und Links