Para copiar os arquivos em um diretório "flat"
Se for possível para o script criar pelo menos uma lista de arquivos, mas deve ignorar os problemas que podem ocorrer ao copiá-los, isso deve funcionar.
No caso de duplicatas, ele salvará as duplicatas como duplicate_1_<filename>
, duplicate_2_ 'etc.
Eu usei:
try
<copy_command>
except Exception
pass
Que abrange o maior intervalo possível de erros.
O script:
#!/usr/bin/env python3
import shutil
import os
sourcedir = "/path/to/source"
dest_dir = "/path/to/destination"
for root, dirs, files in os.walk(sourcedir):
for name in files:
subject = root+"/"+name
n = 1; name_orig = name
while os.path.exists(dest_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
try:
newfile = dest_dir+"/"+name
shutil.copy(subject, newfile)
except Exception:
pass
Copie-o para um arquivo vazio, salve-o como giveit_ashot.py
e defina o sourcedir e o destino.
Execute:
python3 /path/to/giveit_ashot.py
B. Se a estrutura do diretório é importante
use o script abaixo, ele primeiro tenta (re) criar os diretórios (de cima para baixo), então copia os arquivos na estrutura o máximo possível. Novamente: deve pelo menos ser possível criar uma lista de arquivos / diretórios.
#!/usr/bin/env python3
import shutil
import os
sourcedir = "/path/to/source"
dest_dir = "/path/to/destination"
dirdata = []
filedata = []
for root, dirs, files in os.walk(sourcedir):
for dir in dirs:
absolute = root+"/"+dir
relative = absolute.replace(sourcedir, "")
dirdata.append([absolute, dest_dir+relative, len(absolute.split("/"))])
for file in files:
abs_file = root+"/"+file
rel_file = abs_file.replace(sourcedir, "") # source
filedata.append((abs_file, dest_dir+rel_file)) # destination
dirdata.sort(key=lambda x: x[2])
for item in dirdata:
try:
if not os.path.exists(item[1]):
os.mkdir(item[1])
except Exception:
pass
for item in filedata:
try:
shutil.copy(item[0], item[1])
except Exception:
pass