web-dev-qa-db-fra.com

Comment organiser / trier les images par données image EXIF

J'ai récupéré des images d'une partition perdue et je dois les trier ou les mettre dans un dossier avant la date de création dans les données EXIF ​​de chaque image.

J'ai installé digiKam et shotwell mais je n'ai pas trouvé le moyen de le faire avec les options.

Quelqu'un peut-il m'expliquer comment procéder avec l'un de ces programmes ou par tout autre moyen?

Ma solution préférée consiste à définir la date du fichier de la même manière que la date de la photo exif. Ce faisant, vous pouvez trier les fichiers à l’aide de n’importe quel outil d’explorateur de fichiers.

  1. Installer tête (apt-get install jhead)
  2. Accédez au répertoire photos et exécutez cette commande jhead -ft *. Cela va définir la date du fichier dans le système de fichiers avec la date de création des métadonnées exif
  3. Allez maintenant dans le menu supérieur (dans Ubuntu, vous allez le plus souvent avec la souris en haut de l’écran du moniteur), sélectionnez Affichage → Trier les images → Par date.
9
neves

Je recommande d'utiliser exiftool . Vous pouvez l'installer avec

Sudo apt install exiftool

Voici un exemple de commande qui renomme les fichiers en fonction de la date de création au format AAAAMMJJ et ajoute un numéro de séquence à la fin.

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

Et voici un exemple de commande qui déplace image.jpg dans un répertoire avec sa date de création comme nom, au format 'AAAA-MM-JJ'.

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

Il existe d'autres exemples de commandes dans la documentation: https://sno.phy.queensu.ca/~phil/exiftool/filename.html

6
Scott

Un excellent outil est Rapid Photo Downloader

  1. Ajout du PPA

    Sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Mise à jour et installation

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

Utilisez votre "partition perdue" comme source d'entrée et configurez le chemin/nom de fichier cible en fonction de vos données exif dans Rapid Photo Downloader

1
A.B.

Utilisation la plus simple: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Il va trier, déplacer et renommer tous vos fichiers JPG du répertoire actuel en une structure de répertoires Nice avec des noms de fichiers uniques /Year/Month/Day/YearMonthDayHourMinute.jpg

Cela ne fonctionne que sur les fichiers * .jpg, pas sur les fichiers RAW

1
Michał Grodecki

Installez le traitement par lot Phatch Photo. Parmi les actions prédéfinies, sélectionnez celle qui renomme les fichiers avec la date exif.

1
galymax

C'est le code que j'utilise. Il renomme les photos en ajoutant 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

Basé sur https://www.tuxradar.com/answers/4 , https://mikebeach.org/2011/12/17/how-to-retrieve-exif-data -de-la-ligne-de-commande-sous-Ubuntu-linux /

Voir aussi, http://davehope.co.uk/Blog/sorting-your-photos-with-bash/

MODIFIER. Dans cette modification, la date dans la balise est transmise au nom ainsi qu’à l’attribut Date avec touch. De plus, si ces balises n'existent pas, la balise de date de modification est transmise au nom du fichier.

#! /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
0
Ferroao