Pergunta complicada, uma vez que os dupes precisam ser renomeados, mas também os renomeados dupes precisam ser verificados por tamanho para todos os seus (possivelmente) renomeados "fellows".
O que faz
Tanto quanto eu posso ver (e testado), o script abaixo faz isso. Ele renomeia possíveis duplicatas para [dupe_1]<file>
, [dupe_1]<file>
etc (se forem de tamanho diferente) e verifica após cada renomeação se o tamanho do arquivo corresponde ao dupe movido ou a suas versões renomeadas no diretório de destino.
#!/usr/bin/env python3
import shutil
import os
#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---
def check_dupe(src, trg):
return os.stat(src).st_size == os.stat(trg).st_size
for root, dirs, files in os.walk(dr):
for file in files:
# define src, target
src = root+"/"+file; trg = dr2+"/"+file
if not os.path.exists(trg):
# if target does not exist: move file
shutil.copy(src, trg)
else:
n = 1
# rename the file, check after every renaming if file exists, if size differs
while os.path.exists(trg):
test = check_dupe(src, trg)
if test != True:
trg = dr2+"/[dupe_"+str(n)+"]"+file
n += 1
else:
break
if test != True:
shutil.copy(src, trg)
Como usar
- Copie o script em um arquivo vazio, salve-o como
reorganize.py
- Na seção head do script, defina os caminhos para o diretório de origem e destino
-
Execute-o pelo comando:
python3 /path/to/reorganize.py
Notas
- Por favor, teste primeiro uma pequena amostra
- Tenha em mente que isso possivelmente criará um diretório enorme "flat", que não será navegável pelo nautilus.