Como organizar / classificar imagens por dados de imagem EXIF

9

Recuperei imagens de uma partição perdida e preciso classificá-las ou colocá-las em uma pasta até a data de criação nos dados EXIF ​​de cada imagem.

Instalei o digiKam e também o shotwell, mas não encontrei o caminho para fazer isso em nenhuma das opções.

Alguém pode me explicar como fazer isso com qualquer um desses programas ou por qualquer outro método?

Mauricio Gracia Gutierrez
fonte

Respostas:

14

Minha solução favorita é definir a data do arquivo igual à data da foto exif. Fazendo isso, você pode classificar os arquivos usando qualquer ferramenta do explorador de arquivos.

  1. Instalar jhead ( apt-get install jhead)
  2. Vá para o diretório de fotos e execute este comando jhead -ft *. Isso definirá a data do arquivo no sistema de arquivos com a data de criação dos metadados exif
  3. Agora basta ir ao menu superior (no Ubuntu você mais passa o mouse pela parte superior da tela do monitor), selecione Exibir → Classificar imagens → Por data.
Neves
fonte
Classificar imagens por data ordenará os arquivos pela data em que foram criados ou modificados. Se você acabou de recuperar muitos arquivos, todos eles terão o mesmo DATE. Para o meu entendimento os metadados EXIF está dentro do arquivo e não coincidem necessariamente com a data do próprio arquivo
Mauricio Gracia Gutierrez
7

Eu recomendo usar exiftool . Você pode instalá-lo com

sudo apt install exiftool

Aqui está um exemplo de comando que renomeia os arquivos com base na data de criação no formato AAAAMMDD e anexa um número de sequência no final.

exiftool '-filename<CreateDate' -d %Y%m%d%%-.4nc.%%le -r

E aqui está um exemplo de comando que se move image.jpgpara um diretório com sua data de criação como nome, no formato 'AAAA-MM-DD'.

exiftool -d %Y-%m-%d "-directory<datetimeoriginal" image.jpg

Há mais exemplos de comandos na documentação: https://sno.phy.queensu.ca/~phil/exiftool/filename.html

Scott
fonte
Scott, eu executo esse comando na pasta em que as imagens estão localizadas? Posso executar isso em uma partição montada em NTFS no Ubuntu?
Mauricio Gracia Gutierrez
2
Aviso obrigatório - não tente fazer isso em sua única cópia dessas fotos - faça uma cópia de backup primeiro para que, se você fizer isso, possa começar de novo. Dito isto, em relação às suas perguntas: Sim, e acho que sim. Por exemplo, se suas cópias de trabalho estiverem armazenadas em / home / me / Pictures / staging, você faria cd /home/me/Pictures/stagingprimeiro e depois chamará o exiftool.
Scott Scott
A mesma linha de comando funcionará para o MS Windows?
Mauricio Gracia Gutierrez
Com base na leitura da descrição no site do autor, acredito que sim: "O ExifTool é uma biblioteca Perl independente de plataforma, além de um aplicativo de linha de comando para ler, escrever e editar meta informações em uma ampla variedade de arquivos". Pode haver algo de especial que você precisa fazer antes de invocá-lo no prompt de comando do Windows (veja abaixo onde se lê "Executável do Windows"), mas eu esperaria que todos os comandos e parâmetros sejam os mesmos em todas as plataformas quando você chegar a esse ponto.
Scott Scott
1

Uma ótima ferramenta é o Rapid Photo Downloader

  1. Adicionando o PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Atualizando e instalando

    sudo apt-get update
    sudo apt-get install rapid-photo-downloader
    

Use sua "partição perdida" como fonte de entrada e configure o caminho / nome dos arquivos de destino com base nos dados exif no Rapid Photo Downloader

AB
fonte
O PPA não é mais mantido. Tentei adicioná-lo e recebi esta mensagem: Este PPA está desatualizado. Para a versão mais recente do Rapid Photo Downloader, consulte damonlynch.net/rapid/download.html
Corey S.
1

Instale o processador em lote do Phatch Photo. Nas ações predefinidas, selecione aquela que renomeia os arquivos com data de exif.

galymax
fonte
1

Uso mais simples: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Ele classifica, move e renomeia todos os seus JPGs do diretório atual para uma boa estrutura de diretório com nomes de arquivos exclusivos /Year/Month/Day/YearMonthDayHourMinute.jpg

Funciona apenas em arquivos * .jpg, e não em arquivos RAW

Michał Grodecki
fonte
Nota: ele pega arquivos do caminho, que é especificado no final da linha de comando : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat
1

Agora existe uma extensão chamada nautilus-columns , que adiciona dados EXIF, além de MP3 (ID3), PDF e mais metadados. Essas novas colunas também podem ser usadas como fonte de classificação.

Instale com:

sudo add-apt-repository ppa:atarea/nautilus-extensions
sudo apt update
sudo apt install nautilus-columns

user2291758
fonte
1

Este é o código que estou usando. Renomeia as fotos adicionando YYYYMMDD_originalname.jpg

#! /bin/bash
shopt -s globstar || exit
for PIC in **
do
# look only for jpg
if [[ "$PIC" =~ \.JPG$ ]] || [[ "$PIC" =~ \.jpg$ ]]; then
    # ignore jpg that have 8 numbers at beginning followed by _ or after IMG_ or P_ and followed by _ (already date stamped)
    if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
    :
    else
        # get the date and time from the tag
        DATE=$(exiftool -p '$DateTimeOriginal' "$PIC" | sed 's/[: ]//g')
        echo "file_$PIC"
        # customize date, in this case eliminate the time, getting only the date in 8 numbers and adding _
        DATEMOD2=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
        echo "datemod2_$DATEMOD2"
            # check if DateTimeOriginal was present
            if [[ "$PIC" == "$DATEMOD2$PIC" ]];then
            # as DateTimeOriginal is not present try with HistoryWhen
            DATE=$(exiftool -p '$HistoryWhen' "$PIC" | sed 's/[: ]//g')
            DATEMOD2B=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
            echo "datemod2B_$DATEMOD2B"
                # check if HistoryWhen is present
                if [[ "$PIC" == "$DATEMOD2B$PIC" ]];then
                # nor the tag DateTimeOriginal, nor HistoryWhen present
                echo "skip"
                else
                # this will be done
                echo "mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2B""$PIC""
                #uncomment if you like it
                #mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2B""$PIC"
                fi
            else
            # this will be done
            echo "mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2""$PIC""
            #uncomment if you like it
            #mv -i "$PIC" $(dirname "$PIC")/"$DATEMOD2""$PIC"
            fi
     fi
fi
done

EDITAR. Nesta modificação, a data na tag é passada para o nome e também para o atributo date com touch. Além disso, se essas tags não existirem, a data da tag de modificação será passada para o nome do arquivo.

#! /bin/bash
shopt -s globstar || exit
for PIC in **
do
# look only for jpg
if [[ "$PIC" =~ \.JPG$ ]] || [[ "$PIC" =~ \.jpg$ ]]; then
        echo "file_$PIC"
        # get the date and time from the tag DateTimeOriginal
        DATE=$(exiftool -p '$DateTimeOriginal' "$PIC" | sed 's/[: ]//g')
        LONGDATE=$(echo $DATE | sed -e 's/^\(.\{12\}\).*/\1/')
            # check if DateTimeOriginal is 0000... OR empty
            if [[ "$LONGDATE" != "000000000000" ]] && [[ -n "$LONGDATE" ]]; then
            echo "datetimeoriginal_$LONGDATE"
            # modify the attribute date with the info in the tag date
            touch -t $LONGDATE "$PIC"
            # customize date, in this case eliminate the time, getting only the date in 8 numbers and adding _
            DATEMOD2=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
            echo "datemod2_$DATEMOD2"
                    # skip renaming if
                    # 8 numbers at beginning followed by _ or after IMG_ or P_ and followed by _ (already date stamped)
                    if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
                    :
                    else
                    # this will be done

                    filename=$(basename "$PIC")
                    echo "$filename"
                    echo "mv -i \""$PIC"\" \""$(dirname "$PIC")"/"$DATEMOD2""$filename"\""
                    #uncomment if you like it
                    mv -i "$PIC" "$(dirname "$PIC")/$DATEMOD2$filename"

                    fi
            else
            # get the date and time from the tag HistoryWhen

            DATE=$(exiftool -p '$HistoryWhen' "$PIC" | sed 's/[: ]//g')
            LONGDATE=$(echo $DATE | sed -e 's/^\(.\{12\}\).*/\1/')

            # check if Historywhen is 0000... or empty
                if [[ "$LONGDATE" != "000000000000" ]] && [[ -n "$LONGDATE" ]]; then
                echo "historywhentag_$LONGDATE"

                touch -t $LONGDATE "$PIC"
                DATEMOD2B=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
                echo "datemod2B_$DATEMOD2B"

                    if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
                    :
                    else
                    # this will be done             
                    filename=$(basename "$PIC")
                    echo "$filename"
                    echo "mv -i \""$PIC"\" \""$(dirname "$PIC")"/"$DATEMOD2B""$filename"\""
                    #uncomment if you like it
                    mv -i "$PIC" "$(dirname "$PIC")/$DATEMOD2B$filename"
                    fi

                else
                    # get the date and time from the tag tag filemodifydate

                    DATE=$(exiftool -p '$filemodifydate' "$PIC" | sed 's/[: ]//g')
                    LONGDATE=$(echo $DATE | sed -e 's/^\(.\{12\}\).*/\1/')

                    # check if filemodifydate is 0000... or  empty
                    if [[ "$LONGDATE" != "000000000000" ]] && [[ -n "$LONGDATE" ]]; then
                    #echo "filemodifydatetag_$LONGDATE"

                    #touch -t $LONGDATE "$PIC"
                    DATEMOD2C=$(echo $DATE | sed -e 's/^\(.\{8\}\).*/\1_/')
                    echo "datemod2C_$DATEMOD2C"

                        if [[ "$PIC" =~ [[:digit:]]{8}_.*$ ]] || [[ "$PIC" =~ IMG_[[:digit:]]{8}_.*$] ]] || [[ "$PIC" =~ P_[[:digit:]]{8}_.*$] ]]; then
                        :
                        else
                        # this will be done             
                        filename=$(basename "$PIC")
                        echo "$filename"
                        echo "mv -i \""$PIC"\" \""$(dirname "$PIC")"/"$DATEMOD2C""$filename"\""
                        #uncomment if you like it
                        mv -i "$PIC" "$(dirname "$PIC")/$DATEMOD2C$filename"
                        fi

                    else

                    echo "Error, NO date available"
                    fi
                fi
            fi
fi
done

Para classificar em pastas (ano e mês) (AAAAMM):

exiftool "-Directory<DateTimeOriginal" -d "%Y%m" *
Ferroao
fonte