Encontre e exclua arquivos duplicados em vários discos rígidos de uma só vez

Encontre e exclua arquivos duplicados em vários discos rígidos de uma só vez

Tenho 4 discos rígidos e quero descobrir quais arquivos nesses quatro discos rígidos (incluindo subdiretórios) são duplicados. Deve ser verificado não apenas dentro de um disco rígido, mas também em todos os outros.

Os discos rígidos são grandes (3 TB), portanto devem ser eficientes (primeiro nome de arquivo do que verificações de soma de verificação ou algo assim)

Responder1

O script abaixo procura arquivos duplicados em até 10 diretórios de uma vez, procurando duplicatas nocombinadodiretórios.

Deve ser dramaticamente mais rápido que ambos fdupes(running fdupes -r) e fslint; em um diretório relativamente pequeno de 40 GB, armazenado localmente, o script levou 5 segundos para criar uma lista de duplicatas, enquanto demorou fdupesmuito fslintmais (~ 90/100 segundos). Em um diretório maior (700 GB, aproximadamente 350.000 arquivos) em uma unidade USB externa relativamente lenta, demorou 90 minutos. Com fdupes demoraria mais de 200-250 minutos, olhando a indicação de progresso (o que é legal, o script abaixo não mostra o progresso), mas não esperei até o fim.
Devo mencionar que, por exemplo, fslintoferece funcionalidades adicionais, o que o script não oferece (como está), portanto a comparação é estritamente na criação da lista de ingênuos.

Além disso, a velocidade depende em parte da velocidade de leitura do disco: testei várias mídias (ao em uma unidade de rede) com enormes diferenças, especialmente em diretórios menores, onde a criação da lista de arquivos ocupa uma parte relativamente grande do trabalho (' é hora).

O resultado final é que, de qualquer forma, não será um trabalho rápido. Você pode se perguntar se os diretórios não são muito grandes.

Como funciona

Quando o script encontra duplicatas, as duplicatas são listadas da seguinte forma:

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

e assim por diante

O roteiro

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

Copie-o para um arquivo vazio, salve-o como find_dupes.pye execute-o com o comando:

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

Até no máximo 10 diretórios

Mais opções do script

É relativamente simples adicionar funcionalidades adicionais; mova as duplicatas para outro diretório, por exemplo, renomeando etc., para que você possa decidir manualmente ou automaticamente qual arquivo manter.

Como tornar o trabalho viável

Seus diretórios parecem enormes. Para tornar o trabalho razoavelmente possível, existe outra maneira mais sofisticada de evitar que o sistema "sufoca": em vez de fazer o trabalho em todos os tipos de arquivos (extensões) de uma só vez, você poderia cortar o trabalho emseções por tipo de arquivo. Um pequeno teste em um diretório de 30.000 arquivos reduziu o tempo de aprox. 20 segundos (todos os arquivos) a 0,3 segundos para uma extensão.

Para fazer o script procurar duplicatas de apenas um tipo de arquivo, substitua a seção do 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)

Encontrando extensões de arquivo que ocorrem

Para listar todas as extensões de arquivo que ocorrem em um diretório, você pode usar o script abaixo:

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

Copie-o para um arquivo vazio, salve-o como find_extensions.pye execute-o com o comando:

python3 <script> <diretory>

Exemplo de saída:

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

Responder2

Se você quiser usar uma GUI muito capaz, experimente o FSlint no Centro de Software.

(Vejo que @lemonsqueeze sugeriu isso nos comentários acima).

Aqui está uma resposta que descreve o uso do FSlint: https://askubuntu.com/a/472244/100356

Responder3

Usei o projeto FSlint e descobri como fazer isso.

Meu processo para resolver tudo isso em vários discos com a necessidade de executar tudo via CLI e tela

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -delete& find path1/2/3 -type d -empty -delete(para se livrar de todas as coisas vazias ou não completamente copiadas)
  3. /usr/share/fslint/fslint/findsn path1 path2 path3(exclua tudo o que está armazenado no mesmo diretório com o mesmo tamanho em discos diferentes)
  4. /usr/share/fslint/fslint/findup path1 path2 path3(exclua todos os arquivos duplicados)
  5. find path1/2/3 -type d -empty -delete(para se livrar dos diretórios que estão vazios após a localização)

depois disso, consegui montar todos os discos como uma unidade combinada mhddfsnovamente, sem ter duplicatas desperdiçando espaço em disco novamente

informação relacionada