Busque y elimine archivos duplicados en varios discos duros a la vez

Busque y elimine archivos duplicados en varios discos duros a la vez

Tengo 4 discos duros y quiero saber qué archivos de estos cuatro discos duros (incluidos los subdirectorios) están duplicados. Debe comprobarse no sólo dentro de un disco duro sino también con todos los demás.

Los discos duros son grandes (3 TB), por lo que tienen que ser eficientes (primero el nombre del archivo, luego las comprobaciones de suma de comprobación o algo así)

Respuesta1

El siguiente script busca archivos duplicados en hasta 10 directorios a la vez, buscando duplicados en elconjuntodirectorios.

Debería ser dramáticamente más rápido que ambos fdupes(ejecutar fdupes -r) y fslint; en un directorio relativamente pequeño de 40 GB, almacenado localmente, el script tardó 5 segundos en crear una lista de duplicados, mientras que tardó fdupesmucho fslintmás (~ 90/100 segundos). En un directorio más grande (700 GB, ~350 000 archivos) en una unidad USB externa relativamente lenta, tomó 90 minutos. Con fdupes habrían pasado más de 200-250 minutos, mirando la indicación de progreso (lo cual es bueno, el siguiente script no muestra el progreso), pero no lo esperé por completo.
Debo mencionar que, por ejemplo, fslintofrece funcionalidad adicional, que el script no ofrece (tal como está), por lo que la comparación se centra estrictamente en la creación de la lista de incautos.

Además, la velocidad depende en parte de la velocidad de lectura del disco: probé varios medios (por ejemplo, en una unidad de red) con grandes diferencias, especialmente en directorios más pequeños, donde crear la lista de archivos requiere una parte relativamente grande del trabajo (' s tiempo).

La conclusión es que de cualquier manera no será un trabajo rápido, usted podría preguntarse si los directorios no son demasiado grandes.

Cómo funciona

Cuando el script encuentra duplicados, los duplicados se enumeran de la siguiente manera:

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

etcétera

La secuencia de comandos

#!/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")

Cópielo en un archivo vacío, guárdelo find_dupes.pyy ejecútelo con el comando:

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

Hasta un máximo de 10 directorios

Más opciones del guión

Es relativamente sencillo agregar funcionalidad adicional; mueva los duplicados a otro directorio, por ejemplo, cambie el nombre, etc., para que pueda decidir manual o automáticamente qué archivo conservar.

Cómo hacer que el trabajo sea factible

Tus directorios parecen enormes. Para que el trabajo sea razonablemente posible, existe otra forma más sofisticada de evitar que el sistema se "ahogue": en lugar de realizar el trabajo en todos los tipos de archivos (extensiones) a la vez, podría dividir el trabajo ensecciones por tipo de archivo. Una pequeña prueba en un directorio de 30.000 archivos redujo el tiempo de aprox. 20 segundos (todos los archivos) a 0,3 segundos para una extensión.

Para que el script busque duplicados de un solo tipo de archivo, reemplace la sección del script:

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)

por:

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)

Encontrar extensiones de archivos que ocurren

Para enumerar todas las extensiones de archivos que aparecen en un directorio, puede utilizar el siguiente script:

#!/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)

Cópielo en un archivo vacío, guárdelo find_extensions.pyy ejecútelo con el comando:

python3 <script> <diretory>

Salida de ejemplo:

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

Respuesta2

Si desea utilizar una GUI muy capaz, pruebe FSlint desde el Centro de software.

(Veo que @lemonsqueeze sugirió esto en los comentarios anteriores).

Aquí hay una respuesta que describe el uso de FSlint: https://askubuntu.com/a/472244/100356

Respuesta3

Utilicé el proyecto FSlint y encontré cómo hacerlo.

Mi proceso para ordenar todo esto en varios discos con el requisito de ejecutar todo a través de CLI y pantalla

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -delete& find path1/2/3 -type d -empty -delete(para deshacerse de todo el material vacío o no completamente copiado)
  3. /usr/share/fslint/fslint/findsn path1 path2 path3(elimine todo lo que esté almacenado en el mismo directorio con el mismo tamaño en diferentes discos)
  4. /usr/share/fslint/fslint/findup path1 path2 path3(eliminar todos los archivos duplicados)
  5. find path1/2/3 -type d -empty -delete(para deshacerse de los directorios que están vacíos después de la búsqueda)

después de eso pude montar todos los discos como una unidad combinada nuevamente mhddfssin tener duplicados y desperdiciar espacio en el disco nuevamente.

información relacionada