Jak organizować / sortować obrazy według danych obrazu EXIF

9

Odzyskałem obrazy z utraconej partycji i muszę je posortować lub umieścić w folderze według daty utworzenia w danych EXIF ​​każdego obrazu.

Zainstalowałem digiKam i shotwell, ale nie znalazłem sposobu na zrobienie tego w żadnej z opcji.

Czy ktoś może mi wyjaśnić, jak to zrobić za pomocą jednego z tych programów lub w jakikolwiek inny sposób?

Mauricio Gracia Gutierrez
źródło

Odpowiedzi:

14

Moim ulubionym rozwiązaniem jest ustawienie daty pliku takiej samej jak data zdjęcia exif. W ten sposób możesz sortować pliki za pomocą dowolnego narzędzia eksploratora plików.

  1. Zainstaluj jhead ( apt-get install jhead)
  2. Przejdź do katalogu zdjęć i uruchom to polecenie jhead -ft *. Spowoduje to ustawienie daty pliku w systemie plików wraz z datą utworzenia metadanych exif
  3. Teraz wystarczy przejść do górnego menu (w Ubuntu najczęściej poruszasz się myszą u góry ekranu monitora), wybierz Widok → Sortuj obrazy → Według daty.
Neves
źródło
Sortuj obrazy według daty uporządkuje pliki według daty ich utworzenia lub modyfikacji. Jeśli właśnie odzyskałeś wiele plików, wszystkie będą miały tę samą DATĘ. W moim rozumieniu metadane EXIF ​​są w pliku i niekoniecznie odpowiadają dacie samego pliku
Mauricio Gracia Gutierrez
7

Polecam stosowanie exiftool . Możesz go zainstalować za pomocą

sudo apt install exiftool

Oto przykładowe polecenie, które zmienia nazwy plików na podstawie daty utworzenia w formacie RRRRMMDD i dołącza numer porządkowy na końcu.

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

A oto przykładowe polecenie, które przenosi image.jpgsię do katalogu z datą utworzenia jako nazwą, w formacie „RRRR-MM-DD”.

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

Dokumentacja zawiera więcej przykładowych poleceń: https://sno.phy.queensu.ca/~phil/exiftool/filename.html

Scott
źródło
Scott, czy mogę uruchomić to polecenie w folderze, w którym znajdują się obrazy? Czy mogę uruchomić to na partycji zamontowanej w systemie NTFS w systemie Ubuntu?
Mauricio Gracia Gutierrez
2
Obowiązkowe słowo ostrzeżenia - nie próbuj tego na swojej jedynej kopii tych zdjęć - najpierw wykonaj kopię zapasową, aby, jeśli przejdziesz do góry, możesz zacząć od nowa. To powiedziawszy, odnośnie twoich pytań: Tak, i tak myślę. Na przykład, jeśli twoje kopie robocze są przechowywane w / home / me / Pictures / staging, najpierw zrobisz cd /home/me/Pictures/staging, a następnie uruchom exiftool.
Scott
Czy ten sam wiersz poleceń będzie działał w MS Windows?
Mauricio Gracia Gutierrez
Bazując na przeczytaniu opisu na stronie autora, uważam, że: „ExifTool jest niezależną od platformy biblioteką Perla oraz aplikacją wiersza poleceń do odczytu, zapisu i edycji meta informacji w wielu różnych plikach”. Może być coś specjalnego, co musisz zrobić, zanim będzie można wywołać go z wiersza polecenia w systemie Windows (zobacz poniżej, gdzie jest napisane „Windows wykonywalny”), ale oczekiwałbym, że wszystkie polecenia i parametry będą takie same na wszystkich platformach dojdź do tego punktu.
Scott
1

Świetnym narzędziem jest Rapid Photo Downloader

  1. Dodanie PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Aktualizacja i instalacja

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

Użyj „utraconej partycji” jako źródła danych wejściowych i skonfiguruj docelową ścieżkę / nazwy plików na podstawie danych exif w Rapid Photo Downloader

AB
źródło
Umowa PPA nie jest już utrzymywana. Próbowałem go dodać i otrzymałem tę wiadomość: ta umowa PPA jest już nieaktualna. Aby uzyskać najnowszą wersję Rapid Photo Downloader, zobacz damonlynch.net/rapid/download.html
Corey S.
1

Zainstaluj proces wsadowy Phatch Photo. Z predefiniowanych działań wybierz ten, który zmienia nazwę plików z datą z exif.

galymax
źródło
1

Najłatwiejszy w użyciu: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Będzie sortować, przenosić i zmieniać nazwy wszystkich plików JPG z bieżącego katalogu na ładną strukturę katalogów z unikalnymi nazwami plików /Rok/Miesiąc/Day/RokMonthDayHourMinute.jpg

Działa tylko na cieście z plikami * .jpg, a nie na plikach RAW

Michał Grodecki
źródło
Uwaga: pobiera pliki ze ścieżki określonej na końcu wiersza poleceń : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat
1

Istnieje teraz rozszerzenie o nazwie nautilus-columns , które dodaje dane EXIF, a także MP3 (ID3), PDF i więcej metadanych. Te nowe kolumny można również wykorzystać jako źródło sortowania.

Zainstaluj za pomocą:

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

użytkownik2291758
źródło
1

To jest kod, którego używam. Zmienia nazwę zdjęć, dodając 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

EDYTOWAĆ. W tej modyfikacji data w tagu jest przekazywana do nazwy, a także do atrybutu date za pomocą dotyku. Ponadto, jeśli te tagi nie istnieją, data modyfikacji jest przekazywana do nazwy pliku.

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

Do sortowania w folderach (rok i miesiąc) (RRRRMM):

exiftool "-Directory<DateTimeOriginal" -d "%Y%m" *
Ferroao
źródło