[PYTHON] Doppelte Dateientfernung

Hintergrund

Mit langjähriger PC-Erfahrung habe ich verschiedene Dateien auf verschiedenen Medien gespeichert. Da ich es lose vereinheitlichen möchte, habe ich NAS eingeführt und nacheinander von einzelnen Medien (USB-Flash, HDD, MO !, FDD !! usw.) kopiert (progressiver Typ). Die meisten alten Medien haben eine geringe Kapazität und nehmen viel Platz ein, sodass sie verworfen werden.

Das Problem ist, dass die Daten bei jeder Migration des PCs auf der Festplatte gespeichert werden. Viele übernehmen vom vorherigen PC und übernehmen ... × n ... Es gibt viele doppelte Dateien. Es gibt viele Duplikate in den Medien, die zum Herausnehmen kopiert wurden, und es gibt Unterschiede in den Versionen, so dass es Chaos gibt.

Im Moment ordne ich nur ein Verzeichnis einem Medium zu und kopiere es, aber da NAS auch endlich ist, wollte ich zumindest dieselbe Datei entfernen.

Lösung

Es scheint viele hervorragende Tools zu geben, aber ich habe nicht die Motivation, kostenlos gute zu finden. Aus diesem Grund erstellen wir ein Skript, um Duplikate zu entfernen, während wir es automatisch und mit eigenen Augen überprüfen.

Annahme: UNIX-ähnliche Umgebung (Befehlssystem der GNU-Serie) rdfind installiert

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

Bei der Ausführung wird ein Shell-Skript mit einer großen Anzahl auskommentierter RM-Befehle erstellt. Duplikate werden vermieden, indem andere als die erforderlichen Kommentare ausgeschlossen werden.

Ich denke, es ist eine gute Idee, nicht von Anfang an zu kommentieren, außer für den ersten Block, oder die Ausgabe entsprechend der Länge der Liste anzupassen. In meinem Fall wähle ich beispielsweise die Datei aus, die durch ein Schlüsselwort gelöscht werden soll, wie im folgenden Python-Skript.

selection.py


import sys

#Beim Löschen einer Datei mit einem Pfad, der die folgenden Schlüsselwörter enthält
rmlist = []
rmlist.append('KEYWORD1')
rmlist.append('KEYWORD2')
rmlist.append('KEYWORD3')
# as well ...

#Kommentieren Sie den Pfad aus, der das Schlüsselwort enthält
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:   #Lassen Sie die letzte in der Liste der gleichen Dateien
                print(token.replace('#',''))
            else:
                print(token)
        else:
            print(token)

    return 0

#Prozess mit Standardeingabe
lines = []
for line in sys.stdin:
    if line != '\n':
        lines.append(line)
    elif line == '\n':
        print("")
        dummy = process(lines)
        lines = []

Sie können es bis zur letzten Zeile leiten,

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

Sie können anpassen, während Sie das Ergebnis überprüfen. Es kann Situationen geben, in denen Sie die zu speichernden Dateien explizit auswählen möchten.

Recommended Posts

Doppelte Dateientfernung
Dateiabgleich
Eine Datei erstellen
Datei lesen
Dateivorgang