Reorganizar fotos de uma estrutura de pastas existente em uma nova estrutura

1

Eu tenho um diretório de photoys que foram (re) organizados antes em uma estrutura de diretórios: Year / Month / Day .

Além do fato de que não é um agrupamento conveniente para mim, há erros nele. Por exemplo; na minha pasta de 2007 tem fotos de 2010.

Eu sei que existem alguns programas (como o Shotwell) para organizar fotos, mas eles lutam com o grande número de imagens que eu tenho, e também todos eles parecem manter a estrutura de arquivos existente.

O que eu gostaria de fazer é tirar todas as fotos das pastas e reorganizá-las corretamente de acordo com a estrutura: Ano / Mês . Isso facilitaria a navegação e colocá-los em álbuns.

Haveria uma maneira à prova de idiotas de fazer isso? Além disso, um link para uma discussão útil no fórum sobre isso poderia me ajudar muito.

    
por Zebla 07.02.2015 / 17:31

3 respostas

2

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

  1. O script usa exif para ler os metadados:

    sudo apt-get install exif
    
  2. copie o script abaixo em um arquivo vazio.

  3. 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"
    #---
    
  4. salve o script como reorganize.py .

  5. Crie o diretório direcionado (superior), se necessário
  6. 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)
    
por Jacob Vlijm 09.02.2015 / 09:39
0

link
Baixe o pacote.
Encontrar "instruções de instalação" ( link )

Script bash não testado, usando "exiftool" acima.

$ cat exifto 
#!/bin/bash

exiftool -r \
-d $HOME/Pictures/Original_Images/%Y/%m/%d/%%f.%%e \
 "-filename<filemodifydate" \
 /media/MEMORY_CARD/DCIM/
$

O Exiftool pode fazer muito mais que isso.

    
por Hannu 26.03.2017 / 17:26
0

Fazendo isso com um utilitário Python

Uma ferramenta foi feita por @andrewning para esse propósito exato, permitindo que você cuide disso, bem como de qualquer casos de ponta que você vem por

1. Instalação

A instalação é tão simples quanto executar pip install sortphotos

2. Uso

Depois de instalá-lo, ele existe como um comando chamado por sortphotos . Para classificar as fotos de acordo com o que você deseja na pergunta, basta executá-las como

sortphotos -r ./source ./destination --sort %Y/%m-%b

Aqui, a string de formato dada por --sort determina a estrutura na qual as fotos no diretório source são organizadas no diretório destination , aqui ele classifica os arquivos conforme mostrado abaixo:

A string de formato pode ser especificada como usada na strftime especificação com / (barras invertidas) separando subdiretórios

3. Notas Adicionais

Qualquer colisão de nomes (ou seja, duas fotos com o mesmo nome no mesmo mês) terá automaticamente um número anexado a elas. Se você quiser apenas simular o movimento dos arquivos para ver se tudo está em ordem, basta usar o sinalizador -t da seguinte forma:

sortphotos -tr ./source ./destination --sort %Y/%m-%b

Todos os arquivos que não possuem dados EXIF válidos são armazenados em uma subpasta chamada Unknown por padrão, mas podem ser alterados pela opção --unknown-dir

    
por Amith KK 21.07.2018 / 09:17