Ich habe einen Ordner mit doppelten (von md5sum
( md5
auf einem Mac)) Dateien, und ich möchte einen Cron- Job planen, um alle gefundenen zu entfernen.
Ich bin jedoch nicht sicher, wie das geht. Was ich bisher habe:
md5 -r * | sort
Welches gibt so etwas aus:
04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg
Wie kann ich basierend auf dem MD5 der Datei verarbeiten, um Duplikate zu entfernen? Es ist mir egal, welches "Original" ich behalte - aber ich möchte nur eines behalten.
Sollte ich das anders angehen?
bash
shell-script
hashsum
duplicate
Labyrinth
quelle
quelle
fdupes
Befehl, der dies ausführt ... Ich bin mir nicht sicher, auf welcher Distribution Sie sich befinden, aber er befindet sich in einem Debian-Paket mit demselben Namen. Außerdem ist MD5 heutzutage ein ziemlich schwacher Hash. Sie möchten wahrscheinlich verwendensha256sum
oder bessersha512sum
(was auf normaler PC-Hardware eigentlich schneller sein sollte )Antworten:
Ich arbeite unter Linux, was bedeutet, dass dies der Befehl ist, der Folgendes
md5sum
ausgibt:Jetzt mit
awk
undxargs
der Befehl wäre:Der
awk
Teil wirdlasthash
mit der leeren Zeichenfolge initialisiert , die keinem Hash entspricht, und prüft dann für jede Zeile, ob der Hash-Inlasthash
mit dem Hash (erste Spalte) der aktuellen Datei (zweite Spalte) übereinstimmt . Wenn ja, wird es ausgedruckt. Am Ende jedes Schritts wirdlasthash
der Hash der aktuellen Datei festgelegt (Sie können dies so einschränken, dass er nur festgelegt wird, wenn die Hashes unterschiedlich sind. Dies sollte jedoch eine untergeordnete Rolle spielen, insbesondere wenn Sie nicht über viele übereinstimmende Dateien verfügen). Die Dateinamen awk ausspuckt zugeführt werdenrm
mitxargs
, was im Grunde ruftrm
mit dem, was dasawk
Teil uns gibt.Sie müssen wahrscheinlich vorher Verzeichnisse filtern
md5sum *
.Bearbeiten:
Mit der Marcins-Methode können Sie auch diese verwenden:
Dies wird von der Dateiliste abgezogen, die durch
ls
den ersten Dateinamen jedes eindeutigen Hashs ausgewählt wurde, der durch ausgewählt wurdemd5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'
.quelle
md5 -r * | sort -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm
ist der Ruf auf O X (pro @ Stephen Kitt ‚s Vorschlag, ich ein legeecho 'will remove '
am Ende , bevor es mit dem Versuchrm
)sort -t ' ' -k 4 -r
zusort
.Sie können doppelte Dateien mit dem folgenden Befehl identifizieren:
quelle
Als Antwort auf diese ähnliche Frage bin ich auf fdupes gestoßen : /superuser/386199/how-to-remove-duplicated-files-in-a-directory
Ich konnte
apt-get install fdupes
auf Ubuntu. Sie werden auf jeden Fall die Manpage lesen wollen. In meinem Fall konnte ich die gewünschten Ergebnisse wie folgt erzielen:fdupes -qdN -r /ops/backup/
Darin heißt es: "Durchsuchen Sie rekursiv / ops / backup und finden Sie alle doppelten Dateien: Behalten Sie die erste Kopie einer bestimmten Datei und entfernen Sie den Rest stillschweigend." Dies macht es sehr einfach, mehrere Speicherauszüge einer Datenbank mit seltenem Schreibvorgang zu speichern.
quelle
Wenn Sie es eilig haben (oder viele Dateien haben) und den Overhead einer Art vermeiden möchten (es braucht Zeit), aber den Speicher-Overhead einer Hash-Tabelle nicht stören (oder wenn Sie viel RAM mit Ihren Losen haben) von Dateien),
find . -type f -print0
: Finden Sie alle Dateien und geben Sie sie mit nullterminierten Namen ausxargs -0 md5sum
: Hashes parallel berechnen (-n
max-args und-P
max-procs nach Wunsch anpassen , sieheman xargs
)awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }'
: Wenn die awk-Hashtabelle einen Eintrag enthält, der die aktuell angezeigte md5sum enthält, drucken Sie den aktuell angezeigten Dateinamen nullterminiert aus. Andernfalls fügen Sie den Dateinamen zur Hash-Tabelle hinzu.xargs -0 rm
: Nehmen Sie die eingefügten nullterminierten Zeichenfolgen und senden Sie sie an rm.Dies ist viel schneller als fdupes.
Wenn Sie einen Dateinamen haben, der eine neue Zeile enthält, wird awk diese wahrscheinlich an der neuen Zeile abschneiden, da md5sum Datensätze auch durch Zeilenumbrüche trennt.
Dies basiert auf /programming/11532157/remove-duplicate-lines-without-sorting und /programming/9133315/how-can-i-output-null-terminated- Strings-in-Awk
quelle
quelle
Eigenschaften:
ls
mit einer Sortierung oder einem Alias versehen haben--color=always
quelle