Suchen und löschen Sie doppelte Dateien auf mehreren Festplatten gleichzeitig

Suchen und löschen Sie doppelte Dateien auf mehreren Festplatten gleichzeitig

Ich habe 4 Festplatten und möchte herausfinden, welche Dateien auf diesen vier Festplatten (einschließlich Unterverzeichnissen) Duplikate sind. Dies soll nicht nur innerhalb einer Festplatte, sondern auch gegenüber allen anderen überprüft werden.

Die Festplatten sind groß (3 TB), daher muss es effizient sein (zuerst Dateiname, dann Prüfsummenprüfungen oder so).

Antwort1

Das folgende Skript sucht nach doppelten Dateien in bis zu 10 Verzeichnissen gleichzeitig und sucht nach Duplikaten inkombiniertVerzeichnisse.

Es sollte wesentlich schneller sein als sowohl fdupes(Ausführen von fdupes -r) als auch fslint; in einem relativ kleinen Verzeichnis von 40 GB, lokal gespeichert, brauchte das Skript 5 Sekunden, um eine Duplikatsliste zu erstellen, während es bei fdupesund fslintviel länger dauerte (~ 90 / 100 Sekunden). In einem größeren Verzeichnis (700 GB, ~ 350.000 Dateien) auf einem relativ langsamen externen USB-Laufwerk dauerte es 90 Minuten. Mit fdupes hätte es über 200-250 Minuten gedauert, wenn man sich die Fortschrittsanzeige ansieht (die ganz nett ist, das folgende Skript zeigt den Fortschritt nicht an), aber ich habe nicht die ganze Zeit darauf gewartet.
Ich sollte erwähnen, dass zum Beispiel fslintzusätzliche Funktionen bietet, die das Skript (in seiner jetzigen Form) nicht bietet, also bezieht sich der Vergleich strikt auf das Erstellen der Duplikatsliste.

Darüber hinaus hängt die Geschwindigkeit unter anderem von der Lesegeschwindigkeit der Platte ab: Ich habe mehrere Medien getestet (ua auf einem Netzlaufwerk) und die Unterschiede waren groß, insbesondere bei kleineren Verzeichnissen, wo das Erstellen der Dateiliste einen relativ großen Teil der Arbeit (Zeit) in Anspruch nimmt.

Unterm Strich wird es so oder so keine schnelle Arbeit sein, man fragt sich aber, ob die Verzeichnisse nicht zu groß sind.

Wie es funktioniert

Wenn das Skript Duplikate findet, werden die Duplikate wie folgt aufgelistet:

Creating file list... /home/jacob/Bureaublad/test2
Creating file list... /home/jacob/Bureaublad/foto
Creating file list... /home/jacob/Bureaublad/Askubuntu
Checking for duplicates (10790 files)...
------------------------------------------------------------ 
>  found duplicate: test1.txt 2 

/home/jacob/Bureaublad/test2/test1.txt
/home/jacob/Bureaublad/test2/another directory/test1.txt
------------------------------------------------------------ 

und so weiter

Das Drehbuch

#!/usr/bin/env python3

import os
import sys

total_filelist = []
total_names = []

def find_files(directory):
    l = []; l2 = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            l.append(file)
            l2.append(root+"/"+file)
    return (l, l2)

i = 1
while i <= 10:
    try:
        dr = (sys.argv[i])
        print("Creating file list...", dr)
        total_filelist = total_filelist+find_files(dr)[1]
        total_names = total_names+find_files(dr)[0]
        i = i+1
    except IndexError:
        break

print("Checking for duplicates ("+str(len(total_names)),"files)...")

for name in set(total_names):
    n = total_names.count(name)
    if n > 1:
        print("-"*60,"\n>  found duplicate:",
              name, n, "\n")
        for item in total_filelist:
            if item.endswith("/"+name):
                print(item)

print("-"*60, "\n")

Kopieren Sie es in eine leere Datei, speichern Sie es unter find_dupes.pyund führen Sie es mit dem folgenden Befehl aus:

python3 <script> <directory1> <directory2> <directory3> 

Bis zu maximal 10 Verzeichnisse

Weitere Optionen des Skripts

Es ist relativ einfach, zusätzliche Funktionen hinzuzufügen, z. B. Duplikate in ein anderes Verzeichnis zu verschieben, umzubenennen usw., sodass Sie entweder manuell oder automatisch entscheiden können, welche Datei behalten werden soll.

So wird die Arbeit machbar

Ihre Verzeichnisse scheinen riesig zu sein. Um die Arbeit einigermaßen möglich zu machen, gibt es eine andere, ausgefeiltere Möglichkeit, das System vor dem "Ersticken" zu schützen: Anstatt die Arbeit auf alle Dateitypen (Erweiterungen) gleichzeitig auszuführen, könnten Sie die Arbeit inAbschnitte pro DateitypEin kleiner Test mit einem Verzeichnis von 30.000 Dateien reduzierte die Zeit von ca. 20 Sekunden (alle Dateien) auf 0,3 Sekunden für eine Erweiterung.

Um das Skript nach Duplikaten nur eines Dateityps suchen zu lassen, ersetzen Sie den Abschnitt des Skripts:

def find_files(directory):
    l = []; l2 = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            l.append(file)
            l2.append(root+"/"+file)
    return (l, l2)

von:

def find_files(directory):
    l = []; l2 = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".py"): # example .py extension
                l.append(file)
                l2.append(root+"/"+file)
    return (l, l2)

Auffinden vorkommender Dateierweiterungen

Um alle in einem Verzeichnis vorkommenden Dateierweiterungen aufzulisten, können Sie das folgende Skript verwenden:

#!/usr/bin/env python3

import sys
import os

l = []
for root, dirs, files in os.walk(sys.argv[1]):
    for f in files:
        if (
        f.startswith("."),
        f.count(".") == 0,
        f.endswith("~"),
        ) == (False, False, False):
            l.append(f[f.rfind("."):])
for item in set(l):
    print(item)

Kopieren Sie es in eine leere Datei, speichern Sie es unter find_extensions.pyund führen Sie es mit dem folgenden Befehl aus:

python3 <script> <diretory>

Beispielausgabe:

.txt
.mp3
.odt
.py
.desktop
.sh
.ods

Antwort2

Wenn Sie eine sehr leistungsfähige GUI verwenden möchten, probieren Sie FSlint aus dem Software Center aus.

(Ich sehe, dass @lemonsqueeze dies in den Kommentaren oben vorgeschlagen hat).

Hier ist eine Antwort, die die Verwendung von FSlint beschreibt: https://askubuntu.com/a/472244/100356

Antwort3

Ich habe das FSlint-Projekt und Find verwendet, um die Sache fertigzustellen.

Mein Prozess, um all dies auf mehreren Festplatten zu ordnen, mit der Anforderung, alles über CLI und Bildschirm auszuführen

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -delete& find path1/2/3 -type d -empty -delete(um alles leere oder nicht vollständig kopierte Zeug loszuwerden)
  3. /usr/share/fslint/fslint/findsn path1 path2 path3(alles löschen, was im gleichen Verzeichnis mit gleicher Größe auf unterschiedlichen Datenträgern gespeichert ist)
  4. /usr/share/fslint/fslint/findup path1 path2 path3(alle doppelten Dateien löschen)
  5. find path1/2/3 -type d -empty -delete(um die Verzeichnisse loszuwerden, die nach findup leer sind)

danach konnte ich alle Festplatten mhddfswieder als kombiniertes Laufwerk mounten, ohne dass Duplikate wieder Speicherplatz verschwenden

verwandte Informationen