[PYTHON] Suppression de fichiers en double

Contexte

Avec de nombreuses années d'expérience PC, j'ai enregistré divers fichiers sur différents supports. Comme je veux unifier le tout, j'ai introduit le NAS et copié à partir de supports individuels (flash USB, HDD, MO!, FDD !! etc.) l'un après l'autre (type progressif). La plupart des anciens supports ont une faible capacité et prennent beaucoup de place, ils sont donc rejetés.

Le problème, ce sont les données stockées sur le disque dur à chaque fois que le PC est migré. Beaucoup prennent le relais du PC précédent et prennent le relais ... × n ... Il y a beaucoup de fichiers en double. Il y a beaucoup de duplication dans les médias qui ont été copiés pour être retirés, et il y a des différences dans les versions, donc c'est le chaos.

Pour le moment, j'attribue juste un répertoire à un média et je le copie, mais comme le NAS est également fini, je voulais supprimer au moins le même fichier.

Solution

Il semble y avoir de nombreux outils excellents, mais je n'ai pas la motivation d'en trouver de bons gratuitement. Par conséquent, je m'en occupe en créant un script pour supprimer les doublons tout en le vérifiant de mes propres yeux et automatiquement dans une certaine mesure.

Hypothèse: Environnement de type UNIX (système de commande de la série GNU) rdfind installé

mergehelper.sh


#!/bin/bash
# Usage: mergehelper.sh DIR1 DIR2

DIR1=$1
DIR2=$2

rdfind -ignoreempty true -dryrun true ${DIR1} ${DIR2}
grep -v -e '^\s*#' -e '^\s*$' results.txt |  awk '{if ($1=="DUPTYPE_FIRST_OCCURRENCE") printf("\n"); for (i=0; i<=NF; i++){if (i>7) printf("%s "),$i} printf("\n")}' > duplications.txt
cat duplications.txt | sed -e 's/^/#rm -v \"/' | sed -e 's/$/\"/' | sed -e 's/#rm -v \""//g' | sed 's/\ "$/\"/g' > rmfile_comout.sh

Lorsqu'il est exécuté, un script shell d'un grand nombre de commandes rm commentées est créé. La duplication est éliminée en excluant les commentaires autres que ceux requis.

Je pense que c'est une bonne idée de ne pas commenter depuis le début, sauf pour le premier bloc, ou de personnaliser la sortie en fonction de la longueur de la liste. Dans mon cas, par exemple, je sélectionne le fichier à supprimer par mot-clé comme le script python ci-dessous.

selection.py


import sys

#Lors de la suppression d'un fichier avec un chemin contenant les mots-clés suivants
rmlist = []
rmlist.append('KEYWORD1')
rmlist.append('KEYWORD2')
rmlist.append('KEYWORD3')
# as well ...

#Décommentez le chemin qui contient le mot-clé
def process(lines):
    nline = len(lines)
    n = 0
    for line in lines:
        delete = False
        token = line.strip()
        for l in rmlist:
            if l in token:
                delete = True

        if delete:
            n = n + 1
            if n < nline:   #Laissez le dernier dans la liste des mêmes fichiers
                print(token.replace('#',''))
            else:
                print(token)
        else:
            print(token)

    return 0

#Process avec entrée standard
lines = []
for line in sys.stdin:
    if line != '\n':
        lines.append(line)
    elif line == '\n':
        print("")
        dummy = process(lines)
        lines = []

Vous pouvez le diriger vers la dernière ligne,

cat rmfile_comout.sh | python3.x selsction.py > rmfile.sh

Vous pouvez ajuster tout en vérifiant le résultat. Il se peut que vous souhaitiez sélectionner explicitement les fichiers à conserver.

Recommended Posts

Suppression de fichiers en double
Correspondance de fichiers
Créer un fichier
Lire le fichier
Opération de fichier