Как упорядочить / отсортировать изображения по данным изображения EXIF

9

Я восстановил изображения из потерянного раздела, и мне нужно отсортировать их или поместить в папку по дате создания в данных EXIF ​​каждого изображения.

Я установил digiKam и также Shotwell, но не нашел способ сделать это ни на одном из вариантов.

Может кто-нибудь объяснить мне, как это сделать с любой из этих программ или любым другим способом?

Маурисио Грасия Гутьеррес
источник

Ответы:

14

Мое любимое решение - установить дату файла так же, как дату фото exif. Делая это, вы можете сортировать файлы с помощью любого инструмента проводника.

  1. Установить jhead ( apt-get install jhead)
  2. Перейдите в каталог с фотографиями и выполните эту команду jhead -ft *. Это установит дату файла в файловой системе с датой создания метаданных exif.
  3. Теперь просто перейдите в верхнее меню (в Ubuntu вы чаще всего перемещаете мышь через верхнюю часть экрана монитора), выберите View → Sort Images → By Date.
Невиш
источник
Сортировка изображений по дате упорядочит файлы по дате их создания или изменения. Если вы только что восстановили много файлов, все они будут иметь одинаковую ДАТУ. Насколько я понимаю, метаданные EXIF ​​находятся внутри файла и не обязательно соответствуют дате самого файла
Маурисио Грасия Гутьеррес
7

Я рекомендую использовать exiftool . Вы можете установить его с

sudo apt install exiftool

Вот пример команды, которая переименовывает файлы на основе даты создания в формате ГГГГММДД и добавляет в конце порядковый номер.

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

А вот пример команды, которая перемещается image.jpgв каталог с именем создания в качестве имени в формате «ГГГГ-ММ-ДД».

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

В документации есть еще примеры команд: https://sno.phy.queensu.ca/~phil/exiftool/filename.html.

Скотт
источник
Скотт, я запускаю эту команду в папке, где находятся изображения? Можно ли запустить это на смонтированном NTFS-разделе под Ubuntu?
Маурисио Грасия Гутьеррес
2
Обязательное слово предупреждения - не пытайтесь сделать это на своей единственной копии этих фотографий - сначала сделайте резервную копию, чтобы, если вы ее испортили, вы могли начать все сначала. Что касается ваших вопросов: да, и я так думаю. Например, если ваши рабочие копии хранятся в / home / me / Pictures / staging, вы cd /home/me/Pictures/stagingсначала должны это сделать , а затем вызвать exiftool.
Скотт
Будет ли такая же командная строка работать для MS Windows?
Маурисио Грасия Гутьеррес
Основываясь на прочтении описания на сайте автора, я считаю, что «ExifTool - это независимая от платформы библиотека Perl плюс приложение командной строки для чтения, записи и редактирования метаинформации в самых разных файлах». Возможно, вам придется сделать что-то особенное, прежде чем вы сможете вызвать его из командной строки в Windows (см. Там, где написано «Исполняемый файл Windows»), но я ожидаю, что все команды и параметры будут одинаковыми на всех платформах, как только вы добраться до этой точки.
Скотт
1

Отличным инструментом является Rapid Photo Downloader

  1. Добавление PPA

    sudo apt-add-repository ppa:dlynch3/ppa
    
  2. Обновление и установка

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

Используйте ваш «потерянный раздел» в качестве входного источника и настройте целевой путь / имена файлов на основе ваших exif-данных в Rapid Photo Downloader

AB
источник
PPA больше не поддерживается. Попытался добавить его и получил это сообщение: Этот PPA устарел. Для получения последней версии Rapid Photo Downloader см. Damonlynch.net/rapid/download.html
Кори С.
1

Установите пакетный процессор Phatch Photo. Из предопределенных действий выберите тот, который переименовывает файлы с датой из exif.

galymax
источник
1

Простейшее использование: jhead -n%Y/%m/%d/%Y%m%d%H%M /Destination/*.jpg

Он будет сортировать, перемещать и переименовывать все ваши файлы JPG из текущего каталога в красивую структуру каталогов с уникальными именами файлов /Year/Month/Day/YearMonthDayHourMinute.jpg

Работает только на тестовых файлах * .jpg, а не на RAW

Михал Гродецки
источник
Примечание: он берет файлы по пути, который указан в конце командной строки : jhead -n%Y/%m/%d/%Y-%m-%d--%H%M-- *.jpg
Vedavrat
1

Теперь есть расширение под названием nautilus-columns , которое добавляет данные EXIF, а также MP3 (ID3), PDF и другие метаданные. Эти новые столбцы также могут быть использованы в качестве источника сортировки.

Установить с помощью:

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

user2291758
источник
1

Это код, который я использую. Переименовывает фотографии, добавляя 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

РЕДАКТИРОВАТЬ. В этой модификации дата в теге передается в имя, а также в атрибут даты с помощью touch. Кроме того, если эти теги не существуют, тег даты изменения передается в имя файла.

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

Для сортировки в папках (год и месяц) (ГГГГММ):

exiftool "-Directory<DateTimeOriginal" -d "%Y%m" *
Ferroao
источник