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.
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