Eu tenho essa pasta com impressionantes 700 GB e alguns desses arquivos estão duplicados. Muitos deles têm o mesmo nome, alguns duplicados, outros não. Basicamente, tenho cerca de 30 pastas ao lado dessa pasta, cheias de arquivos e mais pastas. Quero pegar todos os arquivos nesta pasta de 700 GB recursivamente e copiá-los de forma não recursiva para outro diretório. Quaisquer conflitos serão tratados com base no tamanho. Se dois arquivos tiverem o mesmo nome e tamanho, o arquivo será ignorado, mas, se dois arquivos tiverem o mesmo nome e tamanhos diferentes, ambos os arquivos serão mantidos. De alguma forma eu posso fazer isso?
Responder1
Pergunta complicada, já que os idiotas precisam ser renomeados, mas tambémrenomeadoos ingênuos devem ser verificados por tamanho para todos os seus (possivelmente) "companheiros" anteriormente renomeados.
O que faz
Pelo que pude ver (e testado), o script abaixo faz isso. Ele renomeia possíveis duplicatas para [dupe_1]<file>
, [dupe_1]<file>
etc (se forem de tamanhos diferentes) e verifica após cada renomeação se o tamanho do arquivo corresponde ao duplicado movido ou às 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 e salve-o como
reorganize.py
- Na seção head do script, defina os caminhos para o diretório de origem e de destino
Execute-o pelo comando:
python3 /path/to/reorganize.py
Notas
- Por favor, teste primeiro em uma pequena amostra
- Lembre-se de que isso possivelmente criará umenormeDiretório "flat", que não será navegável pelo nautilus.
Responder2
tente isto:
cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
if [ -e [destination_folder]/"$file" ]; then
if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
false
else
cp "$file" [destination_folder]/"$file"...
fi
else
cp "$file" [destination_folder]/
fi
echo "$file copied"
done