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

2

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

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

    
por Jacob Vlijm 09.11.2014 / 09:34

3 respostas

0

Eu usei o projeto FSlint e descobri para fazer a coisa.

Meu processo para resolver tudo isso em vários discos com a exigência de executar tudo via CLI & amp; tela

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -delete & amp; 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 descoberta)

Depois disso, consegui montar todos os discos como uma unidade combinada com mhddfs novamente, sem que as duplicatas desperdiçassem espaço em disco novamente

    
por user346999 12.11.2014 / 11:29
3

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

Ele deve ser consideravelmente mais rápido do que fdupes (executando 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 dupe, enquanto levou fdupes e fslint muito mais tempo (~ 90/100 segundos). Em um diretório maior (700 GB, ~ 350000 arquivos) em uma unidade USB externa relativamente lenta, demorou 90 minutos. Com fdupes, teria sido mais de 200-250 minutos, olhando para a indicação de progresso (o que é legal, o script abaixo não mostra o progresso), mas eu não esperei por isso até o fim.
Eu devo mencionar que, por exemplo, fslint oferece funcionalidade adicional, o que o script não faz (como é), então a comparação é estritamente na criação da lista de dupes.

Além disso, a velocidade depende de quanto tempo o disco lê: 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 da trabalho (tempo).

O resultado é que não será um trabalho rápido e, por outro lado, 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 script

#!/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.py e execute-o pelo comando:

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

Até no máximo 10 diretórios

Mais opções do script

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

Como tornar o trabalho factível

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

Para fazer com que o script procure por 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 arquivos que ocorrem

Para listar todas as extensões de arquivos que estão ocorrendo 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.py e execute-o pelo comando:

python3 <script> <diretory>

Exemplo de saída:

.txt
.mp3
.odt
.py
.desktop
.sh
.ods
    
por Jacob Vlijm 10.11.2014 / 07:49
0

Se você quiser usar uma interface gráfica muito eficiente, tente 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: link

    
por PJ Singh 10.11.2014 / 19:11