[Kotlin] Doppelte Dateien löschen [Java]

Was du machen willst

Wenn sich in einem Verzeichnis viele doppelte Dateien befinden, lassen Sie nur eine und löschen Sie die doppelten.

Weise

Der Vergleich der gesamten Datei ist schwierig, da die Verarbeitungskosten hoch sind.

Daher haben wir uns dieses Mal entschlossen, die Hashes (Digests) der Dateien zu vergleichen und sie mit der folgenden Richtlinie zu implementieren.

  1. Nehmen Sie den Hash der Datei und holen Sie sich den Digest
  2. Überprüfen Sie, ob der Digest bereits in "Set" vorhanden ist
  3. Löschen Sie, falls vorhanden
  4. add to Set wenn es nicht existiert

Beispielcode

Das Beispiel, das vorerst funktioniert, ist wie folgt.

import java.io.File
import java.security.MessageDigest

val sha256 : MessageDigest = MessageDigest.getInstance("SHA-256")

fun getDigest(bytes: ByteArray): List<Byte> = sha256.digest(bytes).asList()

fun getFiles(pathToDir: String): List<File> = File(pathToDir).listFiles()?.asList() ?: emptyList()

fun main() {
    val files = getFiles(/*Pfad des zu verarbeitenden Verzeichnisses*/)

    val set = HashSet<List<Byte>>()
    var count = 0

    files.forEach {
        val digest = getDigest(it.readBytes())

        if (!set.add(digest)) {
            if (it.delete()) {
                println("Deleted:\t${it.name}")
                count++
            } else {
                println("Fail delete:\t${it.name}")
            }
        }
    }

    println("\n\n$count deleted.")
}

Ausführungsergebnis

Folding
Deleted:	43_3 Exemplare.gif
Deleted:	46_Kopie von 3 2.gif
Deleted:	70_Kopie von 1 2.gif
Deleted:	94_1 Kopie.gif
Deleted:	50_Kopie von 3 2.gif
Deleted:	66_1 Kopie.gif
Deleted:	95_1 Kopie.jpg
Deleted:	58_3 Exemplare.gif
Deleted:	63_1 Kopie.gif
Deleted:	32_1 Kopie.jpg
Deleted:	55_3 Exemplare.gif
Deleted:	62_3 Exemplare.gif
Deleted:	49_3 Exemplare.gif
Deleted:	9_Kopie von 1 2.gif
Deleted:	47_3 Exemplare.gif
Deleted:	96_1 Kopie.jpg
Deleted:	71_1 Kopie.gif
Deleted:	52_Kopie von 3 2.gif
Deleted:	64_Kopie von 1 2.gif
Deleted:	61_3 Exemplare.gif
Deleted:	56_3 Exemplare.gif
Deleted:	60_Kopie von 3 2.gif
Deleted:	31_1 Kopie.jpg
Deleted:	57_Kopie von 3 2.gif
Deleted:	98_Kopie von 1 2.jpg
Deleted:	34_1 Kopie.jpg
Deleted:	68_1 Kopie.gif
Deleted:	53_3 Exemplare.gif
Deleted:	42_3 Exemplare.gif
Deleted:	74_Kopie von 1 2.gif
Deleted:	30_1 Kopie.gif
Deleted:	36_Kopie von 1 2.gif
Deleted:	65_1 Kopie.gif
Deleted:	100_1 Kopie.jpg
Deleted:	37_1 Kopie.gif
Deleted:	35_Kopie von 1 2.gif
Deleted:	45_3 Exemplare.gif
Deleted:	99_1 Kopie.jpg
Deleted:	87_Kopie von 1 2.jpg
Deleted:	33_1 Kopie.jpg
Deleted:	73_1 Kopie.gif
Deleted:	1_7 Exemplare.jpg
Deleted:	48_3 Exemplare.gif
Deleted:	54_Kopie von 3 2.gif
Deleted:	51_3 Exemplare.gif
Deleted:	67_1 Kopie.gif
Deleted:	93_Kopie von 1 2.gif
Deleted:	44_Kopie von 3 2.gif
Deleted:	72_Kopie von 1 2.gif
Deleted:	97_Kopie von 1 2.jpg


50 deleted.

Kommentar

Wie man einen Hash nimmt

Ich habe java.security.MessageDigest verwendet. Dies kann als Java-Standard verwendet werden, ohne dass Bibliotheken eingeführt werden müssen.

Dieses Mal habe ich "SHA-256" für den Text angegeben, aber wenn Sie sagen "Ich möchte Doppelungen bis zum Limit vermeiden!", Sollten Sie "SHA-512" angeben.

Doppelte Verwaltung

Wahrscheinlich das am einfachsten und billigsten zu verwendende "HashSet". Da in "ByteArray" Bedenken hinsichtlich "gleich" bestehen, wird es hier in "Liste" konvertiert.

Recommended Posts

[Kotlin] Doppelte Dateien löschen [Java]
[Java 8] Doppelte Löschung (& doppelte Überprüfung) mit Stream
[Java] Behandeln Sie Excel-Dateien mit Apache POI
Tipps zur Interoperabilität mit Kotlin zum Senden an Java-Entwickler
[Java] Analysieren Sie Excel-Dateien (nicht auf verschiedene Dateien beschränkt) mit Apathce Tika [Kotlin]
[Java] Holen Sie sich MimeType aus dem Inhalt der Datei mit Apathce Tika [Kotlin]
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Überprüfen Sie mit Java / Kotlin, ob Dateien unter Windows nicht in die Benutzerkontensteuerung geschrieben werden können
[Review] Lesen und Schreiben von Dateien mit Java (JDK6)
[Java] Mit Apathce Tika Metadaten aus Dateien abrufen und Breite und Höhe von Bildern / Videos aus Metadaten abrufen [Kotlin]
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
[Java] Entwicklung mit mehreren Dateien mittels Paket und Import
Installieren Sie Java mit Homebrew
Wechseln Sie die Plätze mit Java
[Kotlin] Japanische Dateien mit ZIP-Komprimierung
Bequemer Download mit JAVA
Behandeln Sie Dateien mit NIO.2.
Schalten Sie Java mit direnv
[Java, Kotlin] Typabweichung
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Erstellen Sie Java mit Wercker
Endian-Konvertierung mit JAVA
[Java / Kotlin] Escape-Verarbeitung (Bereinigung) für HTML5 mit Unbescape [Spring Boot]
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
Kotlin Post- und Pre-Inkrement und Operatorüberladung (Vergleich mit C, Java, C ++)
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!