Cómo organizar / ordenar imágenes por datos de imagen EXIF

9

He recuperado imágenes de una partición perdida y necesito ordenarlas o colocarlas en una carpeta por la fecha de creación en los datos EXIF ​​de cada imagen.

He instalado digiKam y también shotwell, pero no he encontrado la forma de hacerlo en ninguna de las opciones.

¿Alguien puede explicarme cómo hacerlo con cualquiera de esos programas o por cualquier otro método?

Mauricio Gracia Gutierrez
fuente

Respuestas:

14

Mi solución favorita es establecer la fecha del archivo igual que la fecha de la foto exif. Al hacer esto, puede ordenar los archivos usando cualquier herramienta de exploración de archivos.

  1. Instalar jhead ( apt-get install jhead)
  2. Vaya al directorio de fotos y ejecute este comando jhead -ft *. Esto establecerá la fecha del archivo en el sistema de archivos con la fecha de creación de los metadatos exif
  3. Ahora solo vaya al menú superior (en Ubuntu la mayoría de las veces pasa con el mouse por la parte superior de la pantalla del monitor), seleccione Ver → Ordenar imágenes → Por fecha.
neves
fuente
Ordenar imágenes por fecha ordenará los archivos por la fecha en que fueron creados o modificados. Si acaba de recuperar muchos archivos, todos tendrán la misma FECHA. Según tengo entendido, los metadatos EXIF ​​están dentro del archivo y no necesariamente coinciden con la fecha del archivo en sí mismo
Mauricio Gracia Gutiérrez
7

Recomiendo usar exiftool . Puedes instalarlo con

sudo apt install exiftool

Aquí hay un comando de muestra que cambia el nombre de los archivos según la fecha de creación en formato AAAAMMDD y agrega un número de secuencia al final.

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

Y aquí hay un comando de muestra que se mueve image.jpga un directorio con su fecha de creación como su nombre, en el formato 'AAAA-MM-DD'.

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

Hay más comandos de muestra en la documentación: https://sno.phy.queensu.ca/~phil/exiftool/filename.html

Scott
fuente
Scott, ¿ejecuto este comando en la carpeta donde se encuentran las imágenes? ¿Puedo ejecutar esto en una partición montada NTFS en Ubuntu?
Mauricio Gracia Gutiérrez
2
Palabra de advertencia obligatoria: no intente esto en su única copia de estas fotos, haga una copia de seguridad primero para que, si lo hace, pueda comenzar de nuevo. Dicho esto, con respecto a sus preguntas: Sí, y creo que sí. Por ejemplo, si sus copias de trabajo se almacenan en / home / me / Pictures / staging, cd /home/me/Pictures/stagingprimero lo haría , luego invocaría exiftool.
Scott
¿Funcionará la misma línea de comando para MS Windows?
Mauricio Gracia Gutiérrez
Basado en la lectura de la descripción en el sitio web del autor, creo que sí: "ExifTool es una biblioteca Perl independiente de la plataforma más una aplicación de línea de comandos para leer, escribir y editar metainformación en una amplia variedad de archivos". Es posible que tenga que hacer algo especial antes de poder invocarlo desde el símbolo del sistema en Windows (vea debajo donde dice "Ejecutable de Windows"), pero esperaría que todos los comandos y parámetros sean los mismos en todas las plataformas una vez que llegar a ese punto
Scott
1

Una gran herramienta es Rapid Photo Downloader

  1. Agregar el PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Actualización e instalación

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

Utilice su "partición perdida" como fuente de entrada y configure la ruta de destino / nombres de archivo en función de sus datos exif en Rapid Photo Downloader

AB
fuente
El PPA ya no se mantiene. Intenté agregarlo y recibí este mensaje: este PPA ahora está desactualizado. Para obtener la última versión de Rapid Photo Downloader, consulte damonlynch.net/rapid/download.html
Corey S.
1

Instale el procesador por lotes Phatch Photo. De las acciones predefinidas, seleccione la que renombra los archivos con fecha de exif.

galymax
fuente
1

El uso más simple: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Clasificará, moverá y cambiará el nombre de todos sus JPG del directorio actual a una estructura de directorios agradable con nombres de archivo únicos /Year/Month/Day/YearMonthDayHourMinute.jpg

Funciona solo en masa de archivos * .jpg, no en RAW

Michał Grodecki
fuente
Nota: toma archivos de la ruta, que se especifica al final de la línea de comando : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat
1

Ahora hay una extensión llamada nautilus-columnas , que agrega datos EXIF, así como MP3 (ID3), PDF y más metadatos. Estas nuevas columnas también se pueden utilizar como fuente de clasificación.

Instalar con:

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

usuario2291758
fuente
1

Este es el código que estoy usando. Cambia el nombre de las fotos agregando AAAAMMDD_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. En esta modificación, la fecha en la etiqueta se pasa al nombre y también al atributo de fecha con toque. Además, si esas etiquetas no existen, la fecha de la etiqueta de modificación se pasa al nombre del archivo.

#! /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 ordenar en carpetas (año y mes) (AAAAMM):

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