Script para reorganizar fotos em diretórios / ano / mês
O script abaixo faz o seguinte:
- Determina o mês em que a foto foi tirada
- Dentro do seu diretório de destino, ele cria (se necessário) subdiretórios por ano (se as fotos forem encontradas)
- Dentro desses diretórios year , ele cria subdiretórios por mês
- Se o script não conseguir encontrar uma data apropriada, ele criará uma pasta chamada "indeterminada"
Pastas por ano
Subpastas por mês
Como lidar com duplicatas:
-
Uma coisa importante é cuidar dos duplicados de maneira apropriada: as câmeras digitais tiram fotos em séries com nomes semelhantes (como
IMG_1.jpeg
,IMG_2.jpeg
etc). Portanto, as duplicatas precisam ser renomeadas automaticamente ou o script será interrompido ou um grande número de fotos será perdido.
O script renomeia duplicatas como:IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
Como usar
-
O script usa
exif
para ler os metadados:sudo apt-get install exif
-
copie o script abaixo em um arquivo vazio.
-
Na seção head do script, defina o diretório onde você deseja que as fotos sejam copiadas para (diretório de destino):
#--- save_to = "/targeted/directory" #---
-
salve o script como
reorganize.py
. - Crie o diretório direcionado (superior), se necessário
-
Execute o script, com o diretório de origem (a pasta com suas fotos) como um argumento, pelo comando:
python3 /path/to/reorganize.py <source_directory>
Eu fiz o diretório target definido no script, porque você pode querer adicionar outros doretores (novas imagens) ao mesmo diretório, organizado automaticamente, enquanto a source diretório será diferente em situações futuras.
Notas importantes
-
O formato dat pode diferir ligeiramente por câmera. No script, levei em consideração os seguintes formatos:
Datum en tijd |2013:08:18 15:58:46
e
Datum en tijd |2013-08-18 20:21:32
Pode ser diferente em outras câmeras. Se o script não funcionar corretamente, você precisará postar a saída do comando
exif <image>
, mas provavelmente funcionará como deveria. -
O script como é copia as fotos para a (s) nova (s) diretora (s), já que você provavelmente não quer mexer com o diretório original até verificar se tudo correu bem. Se você quiser mover os arquivos, substitua a linha:
shutil.copyfile(file, newfile)
por:
shutil.move(file, newfile)
O script
#!/usr/bin/env python3
import subprocess
import os
import sys
import shutil
#---
save_to = "/targeted/directory"
#---
directory = sys.argv[1]
if not os.path.exists(save_to):
os.mkdir(save_to)
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def check_dir(dr):
if not os.path.exists(dr):
os.mkdir(dr)
def rename_dups(target_dir, name):
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
return target_dir+"/"+name
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
try:
date = [l for l in get("exif "+'"'+file+'"').splitlines()\
if "Dat" in l][0].split("|")[1].split()[0]
if "-" in date:
date = date.split("-")[:2]
elif ":" in date:
date = date.split(":")[:2]
targeted_dir = save_to+"/"+date[0]
check_dir(targeted_dir)
sub_dir = targeted_dir+"/"+date[1]
except:
sub_dir = save_to+"/"+"undetermined"
check_dir(sub_dir)
newfile = rename_dups(sub_dir, name)
shutil.copyfile(file, newfile)