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

9

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

J'ai installé digiKam et également shotwell, mais je n'ai trouvé le moyen de le faire sur aucune des options.

Quelqu'un peut-il m'expliquer comment le faire avec l'un de ces programmes ou par toute autre méthode?

Mauricio Gracia Gutierrez
la source

Réponses:

14

Ma solution préférée est de définir la date du fichier comme la date de la photo exif. Ce faisant, vous pouvez trier les fichiers à l'aide de n'importe quel outil d'exploration de fichiers.

  1. Installer jhead ( apt-get install jhead)
  2. Accédez au répertoire photos et exécutez cette commande jhead -ft *. Cela définira la date du fichier dans le système de fichiers avec la date de création des métadonnées exif
  3. Maintenant, allez simplement dans le menu du haut (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.
neves
la source
Trier les images par date triera les fichiers par date de création ou de modification. Si vous venez de récupérer de nombreux fichiers, tous auront la même date. À ma connaissance, les métadonnées EXIF ​​se trouvent à l'intérieur du fichier et ne correspondent pas nécessairement à la date du fichier lui
Mauricio Gracia Gutierrez
7

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 se déplace image.jpgdans un répertoire avec sa date de création comme nom, au format 'YYYY-MM-DD'.

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

Scott
la source
Scott dois-je exécuter cette commande sur le dossier où se trouvent les images? Puis-je l'exécuter sur une partition montée NTFS sous Ubuntu?
Mauricio Gracia Gutierrez
2
Avertissement obligatoire - n'essayez pas cela sur votre seule copie de ces photos - faites d'abord une copie de sauvegarde afin que, si vous vous y trompez, vous puissiez recommencer. Cela dit, concernant vos questions: oui, et je pense que oui. Par exemple, si vos copies de travail sont stockées dans / home / me / Pictures / staging, vous feriez d' cd /home/me/Pictures/stagingabord, puis invoquer exiftool.
Scott
La même ligne de commande fonctionnera-t-elle pour MS Windows?
Mauricio Gracia Gutierrez
Sur la base de la lecture de la description sur le site Web de l'auteur, je le pense: "ExifTool est une bibliothèque Perl indépendante de la plate-forme ainsi qu'une application en ligne de commande pour lire, écrire et éditer des méta-informations dans une grande variété de fichiers." Il y a peut-être quelque chose de spécial que vous devez faire avant de pouvoir l'invoquer à partir de l'invite de commandes dans Windows (voir sous où il est dit "Exécutable Windows"), mais je m'attendrais à ce que toutes les commandes et les paramètres soient les mêmes sur toutes les plates-formes une fois que vous arriver à ce point.
Scott
1

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 d'accès / noms de fichiers en fonction de vos données exif dans Rapid Photo Downloader

UN B
la source
Le PPA n'est plus maintenu. J'ai essayé de l'ajouter et j'ai reçu ce message: cet APP est maintenant obsolète. Pour la dernière version de Rapid Photo Downloader, voir damonlynch.net/rapid/download.html
Corey S.
1

Installez le processeur par lots Phatch Photo. Dans les actions prédéfinies, sélectionnez celle qui renomme les fichiers avec la date d'exif.

galymax
la source
1

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

Il triera, déplacera et renommera tous vos JPG du répertoire actuel dans une belle structure de répertoires avec des noms de fichiers uniques /Year/Month/Day/YearMonthDayHourMinute.jpg

Il ne fonctionne que sur la pâte de fichiers * .jpg, pas RAW

Michał Grodecki
la source
Remarque: il prend les fichiers du chemin, qui est spécifié à la fin de la ligne de commande : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat
1

Il y a maintenant une extension appelée nautilus-columns , qui ajoute des données EXIF ​​ainsi que MP3 (ID3), PDF et plus de métadonnées. Ces nouvelles colonnes peuvent également être utilisées comme source de tri.

Installer avec:

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

user2291758
la source
1

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

ÉDITER. Dans cette modification, la date dans la balise est passée au nom et également à l'attribut date avec touch. De plus, si ces balises n'existent pas, la date de la balise 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

Pour le tri dans des dossiers (année et mois) (AAAAAM):

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