Suchen und löschen Sie doppelte Dateien mit unterschiedlichen Namen

7

Ich habe eine große Musiksammlung auf meiner Festplatte gespeichert. Beim Durchsuchen stellte ich fest, dass ich in einigen Albumverzeichnissen viele doppelte Dateien habe. Normalerweise befinden sich die Duplikate neben dem Original im selben Verzeichnis.

Normalerweise lautet das Format Dateiname.mp3 und die doppelte Datei Dateiname 1.mp3 . Manchmal kann es mehr als eine doppelte Datei geben, und ich habe keine Ahnung, ob es doppelte Dateien in Ordnern gibt (zum Beispiel Duplikate von Albumverzeichnissen).

Kann ich auf irgendeine Weise nach diesen doppelten Dateien suchen (z. B. durch Vergleichen der Dateigröße oder Vergleichen der gesamten Dateien, um zu überprüfen, ob sie identisch sind), die Ergebnisse überprüfen und dann die doppelten Dateien löschen? Diejenigen, die einen längeren Namen haben, oder diejenigen, die ein neueres Änderungs- / Erstellungsdatum haben, sind normalerweise die Ziele des Löschens.

Gibt es ein Programm, das dies unter Linux kann?

Cestarian
quelle
@ VincentNivoliers Danke, ich denke, dass meine Frage am Ende ein Duplikat ist, obwohl ich nicht nach einem Programm speziell für Musikdateien gefragt habe (ich habe nur Musik als Beispiel verwendet), hat diese Frage die Antworten, die ich brauche, um meine spezifische zu lösen Problem.
Cestarian
1
Ich würde sagen, wenn Ihre Dateien mit den Bits mit unterschiedlichen Namen identisch sind, würde die Frage gelten, und ich würde vorschlagen, ein Hash-Programm in Kombination mit einer Hash-Tabelle zu verwenden, um Duplikate vorzuschlagen. Bei Musiksammlungen ist dies wahrscheinlich nicht der Fall, wenn die entsprechenden Dateien aus verschiedenen Quellen stammen.
Vincent Nivoliers
Ja, das habe ich gemeint, Musikdateien waren nur mein Beispiel, aber da mein genaues Szenario Musikdateien beinhaltet, hat der andere Thread wahrscheinlich bereits eine gute Lösung für mich. Hash-Programm klingt wie eine gute Lösung unabhängig von Dateitypen, wissen Sie eine?
Cestarian
Siehe auch Doppelte Dateien
suchen

Antworten:

12

Es gibt ein solches Programm und es heißt rdfind:

SYNOPSIS
   rdfind [ options ] directory1 | file1 [ directory2 | file2 ] ...

DESCRIPTION
   rdfind  finds duplicate files across and/or within several directories.
   It calculates checksum only if necessary.  rdfind  runs  in  O(Nlog(N))
   time with N being the number of files.

   If  two  (or  more) equal files are found, the program decides which of
   them is the original and the rest are considered  duplicates.  This  is
   done  by  ranking  the  files  to each other and deciding which has the
   highest rank. See section RANKING for details.

Es kann die Duplikate löschen oder durch symbolische oder feste Links ersetzen.

Toby Speight
quelle
Ich probiere dieses Programm jetzt aus.
Cestarian
Dies funktionierte ziemlich gut. Rdfind / mnt / stash / music teilte mir mit, dass insgesamt 1 GB gelöscht werden könnten, und erstellte eine Datei results.txt, um alle Duplikate aufzulisten. rdfind -deleteduplicates true / mnt / stash / music löschte dann 2104 doppelte Dateien für mich. Vielen Dank! Dieses Programm war sehr leistungsstark. Es dauerte nur eine Minute, um meinen über 200 GB großen Musikordner zu durchsuchen, und nur wenige Sekunden, um die doppelten Dateien beim zweiten Durchlauf zu löschen. Es wäre schön gewesen, wenn es auch leere Ordner löschen würde.
Cestarian
10

Hmmph. Ich habe gerade einen Einzeiler entwickelt, um alle Duplikate aufzulisten, für eine Frage, die sich als Duplikat herausstellte. Wie meta. Schade, es zu verschwenden, also werde ich es veröffentlichen, obwohl es sich rdfindnach einer besseren Lösung anhört.

Dies hat zumindest den Vorteil, dass es die "echte" Unix-Methode ist;)

find -name '*.mp3' -print0 | xargs -0 md5sum | sort | uniq -Dw 32

Unterbrechung der Pipeline:

find -name '*.mp3' -print0 Findet alle MP3-Dateien im Teilbaum ab dem aktuellen Verzeichnis und druckt die Namen NUL-getrennt.

xargs -0 md5sum liest die durch NUL getrennte Liste und berechnet für jede Datei eine Prüfsumme.

Sie wissen was sorttut.

uniq -Dw 32 vergleicht die ersten 32 Zeichen der sortierten Zeilen und druckt nur diejenigen, die denselben Hash haben.

So erhalten Sie eine Liste aller Duplikate. Sie können dies dann manuell auf diejenigen reduzieren, die Sie löschen möchten, die Hashes entfernen und die Liste an weiterleiten rm.

Tom Zych
quelle
Für die Aufzeichnung war dies das, was ich ursprünglich als Antwort erhofft hatte: PA ein Liner ohne die Notwendigkeit, zusätzliche Software herunterzuladen (nicht, dass ich etwas dagegen habe, ich mag es einfach, "sauber" zu sein). Andererseits hat rdfind weniger Das manuelle Aussortieren und Entfernen von Dateien mit übereinstimmenden Prüfsummen ist ein wenig Arbeit. Idealerweise sollte dies automatisch erfolgen, indem beispielsweise alle Dateien mit derselben Prüfsumme gelöscht werden, außer für die Datei mit dem kürzesten Dateinamen.
Cestarian
Schöner Einzeiler. Eines der Dinge, rdfinddie besser sind, ist, zuerst die Dateigröße zu überprüfen, um eindeutige Dateien von der Liste auszuschließen
Golimar
2

Ich bin froh, dass du den Job erledigt hast rdfind.

Das nächste Mal könnten Sie auch überlegen rmlint. Es ist extrem schnell und bietet verschiedene Optionen , um festzustellen, welche Datei das Original in jedem Satz von Duplikaten ist.

SeeSpotRun
quelle
Ja, ich mochte rdfinds Ansatz, die Originale zu finden, nicht. Es ist passiert, dass Dateien, von denen ich angenommen hätte, dass sie nicht gelöscht wurden (dh das Original wurde gelöscht), mich nicht wirklich stören, aber wenn ich OCD wäre. ..
Cestarian
2

Ich würde darüber nachdenken, Perl zu verwenden:

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;
use Digest::SHA qw ( sha1_hex );

my %seen;

sub find_dupes {
    next if -d;
    local $/;
    open( my $input, "<", $File::Find::name ) or warn $!;
    my $sha1sum = sha1_hex(<$input>);
    close($input);
    if ( $seen{$sha1sum} ) {
        print "$File::Find::name is probably a dupe of $seen{$sha1sum} - both have $sha1sum\n";
    }
    $seen{$sha1sum} = $File::Find::name;
}

find( \&find_dupes, "/path/to/search", "/another/path/to/search" );
Sobrique
quelle