Ich versuche derzeit, eine Datei (eine Bilddatei wie test1.jpg) zu erstellen, und ich muss eine Liste aller Duplikate dieser Datei (nach Inhalt) haben. Ich habe es versucht, fdupes
aber das erlaubt einer Eingabedatei nicht, ihre Überprüfungen zu begründen.
TLDR: Ich brauche eine Möglichkeit, alle Duplikate einer bestimmten Datei nach ihrem Inhalt aufzulisten.
Suchen Sie vorzugsweise über die Befehlszeile nach einer Lösung, aber auch vollständige Anwendungen sind in Ordnung.
command-line
duplicate
GamrCorps
quelle
quelle
Antworten:
Suchen Sie zuerst den md5-Hash Ihrer Datei:
(Die erste Zeile ist der Befehl, den Sie ausführen müssen, die zweite Zeile ist der MD5-Hash dieser Datei.)
Kopieren Sie dann den Hash (in Ihrem Fall wäre er anders) und fügen Sie ihn in den nächsten Befehl ein:
Wenn Sie Lust haben, können Sie die 2 in einem einzigen Befehl kombinieren:
Sie können sha1 oder einen der anderen ausgefallenen Hashes verwenden, wenn Sie möchten.
Bearbeiten
Wenn der Anwendungsfall darin besteht, "mehrere Multi-Gigabyte-MP4s oder ISO-Dateien" zu durchsuchen, um ein "4-KB-JPG" (gemäß @ Tijn-Antwort) zu finden, würde die Angabe der Dateigröße die Dinge dramatisch beschleunigen.
Wenn die Größe der gesuchten Datei genau 3952 Byte beträgt (Sie können sehen, dass die Verwendung
ls -l path/to/file
dieses Befehls viel schneller ausgeführt wird:Beachten Sie das Extra
c
nach der Größe, das Zeichen / Bytes angibt.Wenn Sie möchten, können Sie dies in einem einzigen Befehl kombinieren:
quelle
Verwenden Sie den Befehl diff mit booleschen Operatoren
&&
und||
Wenn Sie mehrere Dateien in einem bestimmten Verzeichnis durchsuchen möchten, verwenden Sie
cd
dort einefor
Schleife wie folgt:Verwenden Sie in rekursiven Fällen den
find
Befehl, um das Verzeichnis und alle seine Unterverzeichnisse zu durchlaufen (beachten Sie die Anführungszeichen und alle entsprechenden Schrägstriche):quelle
Sie können filecmp in Python verwenden
Zum Beispiel:
Gibt True aus, wenn gleich, andernfalls False
quelle
Holen Sie sich die
md5sum
betreffende Datei und speichern Sie sie in einer Variablen, zmd5
.Verwenden Sie
find
diese Option, um den gewünschten Verzeichnisbaum zu durchlaufen und zu überprüfen, ob eine Datei denselben Hashwert hat. Wenn ja, drucken Sie den Dateinamen aus:find . -type f
Findet alle Dateien im aktuellen Verzeichnis, ändern Sie das Verzeichnis entsprechend Ihren AnforderungenDas
-exec
Prädikat führt den Befehlsh -c ...
für alle gefundenen Dateien ausIn
sh -c
,_
ist ein Platzhalter für$0
,$1
ist die Datei gefunden,$2
wird$md5
[ $(md5sum "$1"|awk "{print \$1}") = "$2" ] && echo "$1"
Gibt den Dateinamen aus, wenn der Hashwert der Datei mit dem übereinstimmt, auf den wir Duplikate prüfenBeispiel:
quelle
Es ist möglich, die
-c
Optionmd5sum
in der Befehlszeile zu verwenden, wenn Sie den Eingabestream ein wenig manipulieren. Der folgende Befehl ist nicht rekursiv, sondern funktioniert nur im aktuellen Arbeitsverzeichnis. Ersetzen Sieoriginal_file
durch den Dateinamen, mit dem Sie Duplikate vergleichen möchten.Sie können das
for f in ./*
Teil durch ersetzenfor f in /directory/path/*
, um ein anderes Verzeichnis zu durchsuchen.Wenn Sie möchten, dass die Suche durch Verzeichnisse wiederholt wird, können Sie die Shell-Option 'globstar' festlegen und zwei Sterne in dem Muster verwenden, das der for-Schleife zugewiesen wurde:
Beide Versionen des Befehls geben nur den Namen doppelter Dateien mit der Anweisung aus
./file is a duplicate
. Sie sind beide in Klammern gekapselt, um zu vermeiden, dass die Hash-Variable oder die Globstar-Shell-Option außerhalb des Befehls selbst festgelegt werden. Der Befehl kann andere Hashing-Algorithmen verwenden, z. B.sha256sum
die beiden Vorkommen von ersetzenmd5sum
, um dies zu erreichen.quelle
@smurf und @heemayl sind sicherlich richtig, aber ich fand heraus, dass es in meinem Fall langsamer war, als ich es wollte; Ich hatte einfach zu viele Dateien zum Verarbeiten. Deshalb habe ich ein kleines Kommandozeilen-Tool geschrieben, von dem ich denke, dass es Ihnen auch helfen könnte. ( https://github.com/tijn/dupfinder ; Ruby; keine externen Abhängigkeiten)
Grundsätzlich verschiebt mein Skript die Hash-Berechnung: Es führt die Berechnung nur durch, wenn die Dateigrößen übereinstimmen. Denn warum sollte ich den Inhalt mehrerer MP4s oder ISO-Dateien mit mehreren Gigabyte über einen Hash-Algorithmus streamen wollen, wenn ich weiß, dass ich nach einem 4-KB-JPG suche? Der Rest des Skripts besteht hauptsächlich aus Ausgabeformatierungen.
Bearbeiten: (danke @Serg) Hier ist der Quellcode des gesamten Skripts. Sie sollten es in
~/bin/find-dups
oder vielleicht sogar speichern/usr/local/bin/find-dups
und dann verwendenchmod +x
, um es ausführbar zu machen. Ruby muss installiert sein, ansonsten gibt es keine anderen Abhängigkeiten.quelle