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