[Kotlin] Supprimer les fichiers en double [Java]

Chose que tu veux faire

Lorsqu'il y a beaucoup de fichiers en double dans un répertoire, n'en laissez qu'un et supprimez les doublons.

manière

La comparaison de l'ensemble du fichier est difficile car le coût de traitement est élevé.

Par conséquent, cette fois, nous avons décidé de comparer les hachages (résumés) des fichiers et de les implémenter avec la politique suivante.

  1. Prenez le hachage du fichier et obtenez le résumé
  2. Vérifiez si le résumé existe déjà dans Set
  3. Supprimer s'il existe
  4. ʻadd to Set` s'il n'existe pas

Exemple de code

L'exemple qui fonctionne pour le moment est le suivant.

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(/*Chemin du répertoire à traiter*/)

    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.")
}

Résultat d'exécution

<détails>

Pliage </ summary>

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


50 deleted.

Commentaire

Comment prendre un hash

J'ai utilisé java.security.MessageDigest. Cela peut être utilisé comme standard Java sans introduire de bibliothèques.

Cette fois, j'ai spécifié SHA-256 pour le texte, mais si vous dites" Je veux éviter la duplication à la limite! ", Je pense que vous devriez spécifier SHA-512.

Gestion des doublons

Probablement le plus simple et le moins cher à utiliser HashSet. De plus, dans ByteArray, il y a des soucis autour de ʻequals, donc ici il est converti en List` et géré.

Recommended Posts

[Kotlin] Supprimer les fichiers en double [Java]
[Java 8] Suppression en double (et vérification en double) avec Stream
[Java] Gérer les fichiers Excel avec Apache POI
Conseils d'interopérabilité avec Kotlin à envoyer aux développeurs Java
[Java] Analyser les fichiers Excel (non limités à divers) avec Apathce Tika [Kotlin]
[Java] Récupère MimeType à partir du contenu du fichier avec Apathce Tika [Kotlin]
Premiers pas avec Kotlin à envoyer aux développeurs Java
Vérifiez avec Java / Kotlin que les fichiers ne peuvent pas être écrits en UAC sous Windows
[Review] Lecture et écriture de fichiers avec java (JDK6)
[Java] Obtenez des métadonnées à partir de fichiers avec Apathce Tika, et obtenez la largeur et la hauteur des images / vidéos à partir des métadonnées [Kotlin]
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Je veux faire des transitions d'écran avec kotlin et java!
[Java] Développement avec plusieurs fichiers en utilisant package et import
Installez java avec Homebrew
Changer de siège avec Java
[Kotlin] Compression ZIP des fichiers japonais
Téléchargement confortable avec JAVA
Gérez les fichiers avec NIO.2.
Changer java avec direnv
[Java, Kotlin] Variance de type
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Conversion Endian avec JAVA
[Java / Kotlin] Traitement d'échappement (désinfection) pour HTML5 avec unbescape [Spring Boot]
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Kotlin post- et pré-incrémentation et surcharge des opérateurs (comparaison avec C, Java, C ++)
Je veux implémenter diverses fonctions avec kotlin et java!